вызов функции ajax возвращает false - PullRequest
1 голос
/ 30 января 2011

У меня есть функция javascript, которая делает JSON-вызов веб-службы с использованием jQuery.В функции успеха мне нужно оценить ответ JSON и при необходимости сделать другой вызов другого метода в том же веб-сервисе.

Вот как я это делаю:

function firstAjaxCall(aid, tid) {
    $.ajax({
        type: "POST",
        contentType: "application/json;charset=utf-8",
        url: "/webservices/Webservice.asmx/Method1",
        data: "{ auctionId: '" + aid + "'}",
        dataType: "json",
        success: function (response) {
            var respData = response.d;
            //do some stuff
            if (respData.HasEnded == true) {
                clearInterval(tid);
                var end = false;
                end = endFunction(aid);
                if (end) {
                    // do some other stuff
                }
            }
        },
        failure: function (errorMsg) { alert(errorMsg.toString()); }
    });
}

иendFunction, которая вызывается из функции успеха ajax:

function endFunction(aid) {
    var hasEnded = false;
    $.ajax({
        type: "POST",
        contentType: "application/json;charset=utf-8",
        url: "/webservices/Webservice.asmx/Method2",
        data: "{ auctionId: '" + aid + "'}",
        dataType: "json",
        success: function (callbackData) {
            var endRespData = callbackData.d;
            hasEnded = endRespData.Success;
            alert(hasEnded.toString());
        },
        failure: function(XMLHttpRequest, textStatus, errorThrown) {
            console.log(textStatus, errorThrown); 
        }
    });
    return hasEnded;
}

Вот странные вещи.Аякс-вызов сделан правильно.Код на сервере работает в соответствии с планом.Тем не менее, если я пытаюсь установить точку останова firebug в функции успеха, значение endFunction(aid) не срабатывает, но отображается окно предупреждения, отображающее слово true.Это несколько хорошо, поскольку кажется, что мы на самом деле достигаем функции успеха.Переменная hasEnded, однако, никогда не устанавливается в true, поэтому она всегда возвращает false.Вызов endFunction(1) из консоли Firebug отображает окно предупреждения со словом true и возвращает значение false.

Что не так?

Ответы [ 2 ]

2 голосов
/ 30 января 2011

AJAX - асинхронный - вызов $.ajax не будет ожидать ответа сервера.

Поэтому строка return hasEnded; выполняется до обратного вызова AJAX.

Вам нужно, чтобы ваш endFunction принял параметр обратного вызова, как $.ajax делает.

0 голосов
/ 30 января 2011

http://api.jquery.com/jQuery.ajax/ Похоже, что вы используете "отказ" в документации, которую вы имеете "ошибка": ошибка (XMLHttpRequest, textStatus, errorThrown) также вы должны сделать что-то вроде этого:

function firstAjaxCall(aid, tid) {
    $.ajax({
        type: "POST",
        contentType: "application/json;charset=utf-8",
        url: "/webservices/Webservice.asmx/Method1",
        data: "{ auctionId: '" + aid + "'}",
        dataType: "json",
        success: function (response) {
            var respData = response.d;
            //do some stuff
            if (respData.HasEnded == true) {
                clearInterval(tid);
                var end = false;
                endFunction(aid,function(endv){
                  if (endv) {
                    // do some other stuff
                  }
                });
            }
        },
        error: function (errorMsg) { alert(errorMsg.toString()); }
    });
}

function endFunction(aid,endcallback) {
    var hasEnded = false;
    $.ajax({
        type: "POST",
        contentType: "application/json;charset=utf-8",
        url: "/webservices/Webservice.asmx/Method2",
        data: "{ auctionId: '" + aid + "'}",
        dataType: "json",
        success: function (callbackData) {
            var endRespData = callbackData.d;
            hasEnded = endRespData.Success;
            alert(hasEnded.toString());
            endcallback(hasEnded);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            console.log(textStatus, errorThrown); 
            endcallback("?");
        }
    });
    //return hasEnded;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...