【问题标题】:jQuery AJAX callback does not set variable before function returns?jQuery AJAX 回调在函数返回之前没有设置变量?
【发布时间】:2012-01-10 18:20:03
【问题描述】:

我有一个函数:

var foo=function(){
var ret="false";
var data={};
data["blah"]="blah";
  $.ajax({

          type: "POST",

          url: "https://website.com/a",

          data: data,

          dataType: "json"

      }).success(function (data) {

          ret=data["stuff"];
         alert("set to "+ret);
      }).error(function (a, b, c) {
    alert("error");
        ret="false";
      });
return ret;
}

当我执行以下操作时: 警报(foo());

我得到以下输出顺序:

1.假

2.设置为真

我希望将 ret 设置为 true,然后返回 false,但这不是正在发生的事情。我做错了什么?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

$.ajax 默认是异步的。所以基本上你 return ret; 之前然后 javascript 将其设置为 ajax 响应。

尝试在$.ajax 调用选项中使用async: false

【讨论】:

  • 如果你真的想要这种行为,当然...... :) +1 只是为了指出这一点,尽管我通常认为这种方法“不理想”。
  • 请注意,设置async : false 将冻结用户的浏览器,直到收到来自服务器的响应。根据 AJAX 请求需要多长时间,这可能会让用户认为他们的浏览器崩溃了几秒钟或更长时间。
  • 我没有使用async: false,这是主要功能之一,没有理由让它async: false
【解决方案2】:

你不能这样做。该函数将在 AJAX 调用完成之前返回。它是异步的。

您不能从 AJAX 函数返回。我建议将与此 AJAX 调用相关的所有逻辑都移到回调中。

【讨论】:

    【解决方案3】:

    您的success 回调函数将在收到ajax 响应时被调用。这可能会延迟很多毫秒,具体取决于网络往返时间。您的 foo 函数不会等待回调完成,而是立即继续。

    如果您有需要 AJAX 调用结果的操作,则需要在 success 回调中执行这些操作。这可能需要您重新构建程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多