Ajax如何进行异步请求和响应同步结果

时间:2012-12-20 06:03:36

标签: javascript jquery ajax jsonp

当我使用jQuery ajax向Web服务发出请求时,我发现了一个很棒的错误:

var AjaxResult;
login = function () {
    AjaxResult = "";
    $.ajax({
        type: "POST",
        url: KnutBase.getServiceUrl() + "ServiceInterface/HmsPlannerWebService.asmx/AuthenticateLogin",
        data: { username: this.username, password: this.password },
        dataType: 'jsonp',
        success: function (response) {
            //the response value is 'success'
            AjaxResult = response;
        },
        error: function (data, status, e) {
            alert("error:" + e);
        }
    });

    //alert(AjaxResult);
    //if i do not alert a message here, this function will return a null value
    //however, i do alert here, then i get a 'success' value.

    return AjaxResult;
}

怎么会发生这种情况。 我很困惑为什么AjaxResult在ajax方法设置响应值之前返回它的值。

4 个答案:

答案 0 :(得分:3)

Ajax是asynchronous调用你的方法,它在后面进行服务器访问的处理。在调用success方法之前,您不会得到结果。您可以阅读有关jquery ajax here

的更多信息

您可以将async属性设置为false的{​​{1}}进行同步通话。

编辑:使用延迟 -

其他代码完成后,

$.Deferred可用于运行代码。 Ajax是一个很好的例子,所有jQuery ajax方法(ajax()除外)都实现了.load接口。您可以使用$.Deferred来观看延期。例如:

$.when

从上面的方法返回deferred,因此您可以执行以下操作:

login = function () {
   return $.ajax({...

任何需要与ajax响应同步的代码都必须进入$.when(login()).done(function (response) { ... }); 回调。

请注意,这与仅使用.done的{​​{1}}回调没有多大区别。关键是你需要在这些回调中完成依赖Ajax返回的所有工作。

答案 1 :(得分:2)

由于ajax是异步的,因此在ajax结果完成之前实际执行return AjaxResult。你不能这样回来;你需要在ajax请求的回调中执行一些操作或使用deferred。

答案 2 :(得分:1)

这与AJAX是异步的事实有关(实际上它是第一个A的含义)。 alert停止代码,直到您按下按钮,请求有时间完成。没有alert,函数立即进行,AJAX几乎没有开始工作,当然值仍然是空的。

通常,您不能让函数返回从AJAX获得的值。为它设置一个回调,并在它到来时处理它。

答案 3 :(得分:1)

  

Ajax如何执行异步请求并返回同步结果

你做不到。这是不可能的。如果你的代码真的试图这样做,它就会失败。