当我使用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方法设置响应值之前返回它的值。
答案 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如何执行异步请求并返回同步结果
你做不到。这是不可能的。如果你的代码真的试图这样做,它就会失败。