Повысить возвращаемое значение обратного вызова onSuccess на возвращаемое значение функции вызывающего абонента - PullRequest
6 голосов
/ 20 апреля 2009

У меня есть функция javascript, которая вызывает универсальную функцию для вызова ajax-сервера. Мне нужно получить результат (true / false) из функции обратного вызова вызова ajax, но результат, который я получаю, всегда «неопределен».

Супер-упрощенная версия универсальной функции без всей моей логики будет:

function CallServer(urlController) {
    $.ajax({
        type: "POST",
        url: urlController,
        async: false,
        data: $("form").serialize(),
        success:
            function(result) {
                if (someLogic)
                   return true;
                else
                   return false;
            },
        error:
            function(errorThrown) {
                return false;
            }
    });
}

И функция, вызывающая его, будет выглядеть примерно так:

function Next() {
        var result = CallServer("/Signum/TrySave");
        if (result == true) {
            document.forms[0].submit();
        }
    }

Переменная «result» всегда имеет значение «undefined», и при ее отладке я вижу, что выполняется строка «return true» функции обратного вызова.

Есть идеи, почему это происходит? Как я мог bubble вернуть значение из функции обратного вызова в функцию CallServer?

Спасибо

Ответы [ 3 ]

15 голосов
/ 20 апреля 2009

На всякий случай, если вы хотите пойти по асинхронному пути (что является лучшим решением, поскольку при выполнении запроса ваш браузер не зависнет), вот код:

function CallServer(urlController, callback) {
    $.ajax({
        type: "POST",
        url: urlController,
        async: true,
        data: $("form").serialize(),
        success:
            function(result) {
                var ret = ( someLogic );
                callback(ret);
            },
        error:
            function(errorThrown) {
                return false;
            }
    });
}

function Next() {
    CallServer("/Signum/TrySave", function(result) {
        if (result == true) {
            document.forms[0].submit();
        }
    });
}
0 голосов
/ 20 апреля 2009

Только что нашел, как это сделать :) Объявление переменной и ее соответствующее обновление из функции обратного вызова. После этого я могу вернуть эту переменную. Я размещаю код для будущих читателей:

function CallServer(urlController) {
    var returnValue = false;
    $.ajax({
        type: "POST",
        url: urlController,
        async: false,
        data: $("form").serialize(),
        success:
            function(result) {
                if (someLogic){
                    returnValue = true;
                    return;
                }
            },
        error:
            function(errorThrown) {
                alert("Error occured: " + errorThrown);
            }
        });

        return returnValue;
}
0 голосов
/ 20 апреля 2009

Я обычно помещаю любой код, который будет выполнен в случае успеха, в саму функцию обратного вызова. Я не думаю, что CallServer() на самом деле получает возвращаемые значения от самих обратных вызовов.

Попробуйте что-то вроде:

function CallServer(urlController) {
    $.ajax({
        type: "POST",
        url: urlController,
        async: false,
        data: $("form").serialize(),
        success:
            function(result) {
                if (someLogic)
                   document.forms[0].submit();
                else
                   // do something else
            },
        error:
            function(errorThrown) {
                // handle error
            }
    });
}

Edit: я не слишком знаком с jQuery, поэтому я могу быть совершенно неправ (я основываю это на поведении других фреймворков, таких как YUI и AJAX-вызовы, сделанные без какой-либо фреймворк). Если это так, просто опустите этот ответ и оставьте комментарий, и я удалю этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...