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

当我使用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方法设置响应值之前返回它的值。

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

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

Ajax是对您的方法的asynchronous调用,它在后面进行处理服务器之旅。 在调用success方法之前,您不会得到结果。 你可以在这里阅读更多关于jquery ajax的信息

您可以将async属性设置为falseajax()以进行同步调用。

编辑:使用延期 –

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

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

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

 $.when(login()).done(function (response) { ... }); 

任何需要与ajax响应同步的代码都必须进入.done回调。

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

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

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

你不能。 这是不可能的。 如果您的代码确实尝试这样做,它将失败。