【问题标题】:return AJAX callback return [duplicate]返回AJAX回调返回[重复]
【发布时间】:2012-01-27 23:13:15
【问题描述】:

例如我有一个函数:

var f1 = function(arg) {
    var a;
    $.ajax({
        ...
        success: function(data) {
            a = f2(data);
            //return a;
        }
    });
    //return a;
}

var f3 = function() {
    a = f1(arg);
}

如何在 AJAX 获取 data in f1 后返回 a

【问题讨论】:

  • 您要发送到哪里。这是一个重要的问题
  • 它是 AJAX... 你需要使用回调函数让你的代码工作。

标签: javascript ajax


【解决方案1】:

您无法返回 ajax 请求的结果,因为请求是异步的(而同步 ajax 请求是一个可怕的想法)。

您最好的选择是将您自己的回调传递给 f1

var f1 = function(arg, callback) {
    $.ajax({
        success: function(data) {
            callback(data);
        }
    });
}

然后你会像这样调用f1

f1(arg, function(data) { 
           var a = f2(data);
           alert(a);
        }
 );

【讨论】:

  • f2代表什么?也许是回调?
  • 没关系,这就解释了:stackoverflow.com/questions/14754619/…
  • 我知道在 c# 中你有异步和等待任务的命令。我不认为你可以在 JS 中做到这一点。如果可以的话,要么像其他人在这里所说的那样进行回调。但是,如果您使用 webpack 或某些 ES(无论现在是什么)编译器,那么您可以使用 Promise。这是 ES(6) exploringjs.com/es6/ch_promises.html987654322@ 中许多新东西的一个很好的免费资源
【解决方案2】:

简短的回答:你不能。

可以a 设为全局,但您会遇到时间问题。

更好:

  1. 传入回调以在 Ajax 成功中运行,或者
  2. 使用 jQuery 的.when/.then construct,或者
  3. 只需在回调中完成工作即可。
  4. (是的,您可以使调用同步。请不要。)

【讨论】:

    【解决方案3】:

    最简单的方法是使 ajax 调用同步。含义在您的 f1 函数中使用 async: false 设置 ajax 调用,以便函数在调用完成并返回数据之前不会继续运行。

    【讨论】:

      【解决方案4】:

      您似乎需要使 ajax 调用同步。你可以这样做:

      $.ajax({
        ...
        async: false,
        success: ...
      });
      return a;
      

      这样 JS 执行将暂停,直到调用返回并且 success 函数运行。

      当然还有同步调用的问题。最好重构代码,以便对 success 回调中的 a 变量执行所需的操作。

      基于这个想法,假设您的 f3 函数是这样的:

      var f3 = function() {
        a = f1(arg);
        alert(a); //i.e. "do something" with "a"
      }
      

      你可以这样做:

      var f3 = function() {
        f1(arg);
      }
      var f3_callback = function(a) {
        alert(a); //i.e. "do something" with "a"
      }
      

      所以,你的成功函数应该是这样的:

      success: function(data) {
        a = f2(data);
        f3_callback(a);
      }
      

      我希望这很清楚!

      【讨论】:

        猜你喜欢
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-12
        相关资源
        最近更新 更多