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
属性设置为false
的ajax()
以进行同步调用。
编辑:使用延期 –
$.Deferred
可用于在其他代码完成后运行代码。 Ajax是一个很好的例子,所有的jQuery ajax方法(除了$.Deferred
)都实现了$.Deferred
接口。 您可以使用$.when
来观看延期。 例如:
login = function () { return $.ajax({...
延迟从上面的方法返回,因此您可以执行以下操作:
$.when(login()).done(function (response) { ... });
任何需要与ajax响应同步的代码都必须进入.done
回调。
请注意,这与仅使用$.ajax
的success
回调没有太大区别。 关键是你需要在这些回调中完成依赖Ajax返回的所有工作。
由于ajax是异步的,因此return AjaxResult
实际上是在ajax结果完成之前执行的。 你不能这样回来; 你需要在ajax请求的回调中执行一些操作或使用deferred。
Ajax如何执行异步请求并返回同步结果
你不能。 这是不可能的。 如果您的代码确实尝试这样做,它将失败。