1

当我使用 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

4 回答 4

3

Ajax 是asynchronous对您的方法的调用,它在后面为服务器执行处理。success在调用该方法之前,您不会得到结果。您可以在此处阅读有关 jquery ajax的更多信息

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

编辑:使用延迟 -

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

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

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

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

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

请注意,这与仅使用success回调并没有太大区别$.ajax。关键是所有依赖于从 Ajax 返回的内容的工作都需要在这些回调中完成。

于 2012-12-20T06:05:27.413 回答
2

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

于 2012-12-20T06:06:18.970 回答
1

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

通常,您不能让函数返回它们从 AJAX 获得的值。给它设置一个回调,当它来的时候处理它。

于 2012-12-20T06:05:29.517 回答
1

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

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

于 2012-12-20T06:08:52.193 回答