【问题标题】:How can Ajax do asynchronous request and response a synchronous resultAjax如何做异步请求和响应一个同步结果
【发布时间】:2012-12-21 00:09:15
【问题描述】:

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

【问题讨论】:

  • 我不知道你从哪里得到了那个 sn-p,但它只是有问题。你是对的,它总是返回空字符串,这不会随着异步回调而改变。
  • 你是否在全局ajax默认选项中设置了{async:false}
  • method:"POST"dataType:"jsonp" 不能一起工作; JSONP 脚本始终是 GET 请求。
  • 贝尔吉,感谢您的帮助。
  • @JackHe:它有效,只是不适用于 JSONP。而且它会让浏览器冻结直到它返回,这就是为什么不关心用户的人应该使用它的原因。

标签: javascript jquery ajax jsonp


【解决方案1】:

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

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

编辑:使用延迟 --

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

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

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

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

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

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

【讨论】:

  • 不使用 JSONP 他不能:p JSONP 不能使用XMLHttpRequest,所以没有async
  • 嗨,阿马丹。你的回答是我发现的正确的东西。似乎数据类型“jsonp”无法进行异步调用。但是,我需要 jsonp 来执行跨域请求。你还有别的想法吗?谢谢
  • 嗨@JackHe。是的,我这样做了,而且我已经在很多地方说过:停止尝试返回该值。 JSONP 没问题;但是将需要该值的代码放入回调中,而不是在login 返回时等待它。这就是“去买盐,我在这里摆弄大拇指等,然后我来做晚饭”和“去买盐,等你拿了就做晚饭,我现在要做点别的”的区别。同步 AJAX 是个坏主意 (TM)。
【解决方案2】:

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

【讨论】:

  • 你能给我举个例子来用“延迟”解决这个问题吗?真的谢谢。
【解决方案3】:

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

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

【讨论】:

  • 阿马丹非常感谢您的回答。你能给我一个简单的例子“为它设置一个回调”。
  • 如果我希望从 ajax 请求中获取值,还有其他方法可以实现吗?
  • 你会 - 在回调中。正如我在另一条评论中所说的那样 - 你以后想用它做什么?因为从这个函数返回它不是一个选项。 (一旦你回答了这个问题,我可以给你一个更具体的答案。)
  • 感谢 Amadan,我想我会使用另一个跨域解决方案。可能是政策文件。
【解决方案4】:

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

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

【讨论】:

  • This is incorrect. - XMLHttpRequest 可以同步,几乎永远不会,因为它严重降低了用户体验。
  • @Amadan 这显然是正确的。如果您真的阅读了他们的建议,“异步请求”而是“同步结果”?不可能。您要么使一切同步,要么使一切异步。你不能混合它们
  • ...但是 Ajax 不执行异步请求。当然也可以使用 Sjax,但本声明中没有讨论。
  • @Ian:哦,从这个意义上说,是的,他是对的——标题是一个非常混乱的句子。
  • @Amadan 非常正确。哈哈,我不确定他们到底在寻找什么异步同步......谁知道
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多