函数调用ajax返回false

时间:2011-01-30 19:42:53

标签: javascript jquery json

我有一个javascript函数,它使用jQuery对Web服务进行JSON调用。 在success函数中,我需要评估JSON响应,如果需要,可以在同一个Web服务中再次调用另一个方法。

我是这样做的:

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()); }
    });
}

和从ajax成功函数中调用的endFunction:

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;
}

这是奇怪的东西。 ajax-call是可以的。服务器上的代码按计划运行。但是,如果我尝试在endFunction(aid)的成功函数中设置一个firebug断点,则表示未点击,但会显示警告框,显示单词true。这有点好,因为我们似乎实际上已达到成功功能。但是,hasEnded变量永远不会设置为true,因此它始终返回false。 从Firebug控制台调用endFunction(1)会显示一个警告框,其中包含true字样,并返回值false

出了什么问题?

2 个答案:

答案 0 :(得分:2)

AJAX 异步 - $.ajax调用不会等待服务器回复。

因此,return hasEnded;行在AJAX回调之前运行。

您需要让endFunction采用回调参数,例如$.ajax

答案 1 :(得分:0)

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;
}