Javascript 返回AJAX回调返回

Javascript 返回AJAX回调返回,javascript,ajax,Javascript,Ajax,例如,我有一个函数: var f1 = function(arg) { var a; $.ajax({ ... success: function(data) { a = f2(data); //return a; } }); //return a; } var f3 = function() { a = f1(arg); } AJAX在f1中获取数据后,如

例如,我有一个函数:

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

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

AJAX在
f1
中获取
数据后,如何返回
a

由于AJAX请求是异步的(而同步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);
        }
 );
$.ajax({
  ...
  async: false,
  success: ...
});
return a;
var f3 = function() {
  a = f1(arg);
  alert(a); //i.e. "do something" with "a"
}
success: function(data) {
  a = f2(data);
  f3_callback(a);
}

简单明了的回答:你不能

你可以把
a
变成一个全局的,但是你会受到时间问题的影响

最好是:

  • 传入回调以在Ajax成功中运行,或者
  • 使用jQuery,或
  • 只需在回调中完成工作
  • (是的,你可以让电话同步。请不要。)

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

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

    f1(arg, function(data) { 
               var a = f2(data);
               alert(a);
            }
     );
    
    $.ajax({
      ...
      async: false,
      success: ...
    });
    return a;
    
    var f3 = function() {
      a = f1(arg);
      alert(a); //i.e. "do something" with "a"
    }
    
    success: function(data) {
      a = f2(data);
      f3_callback(a);
    }
    
    这样,JS执行将暂停,直到调用返回并且
    success
    函数运行为止

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

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

    f1(arg, function(data) { 
               var a = f2(data);
               alert(a);
            }
     );
    
    $.ajax({
      ...
      async: false,
      success: ...
    });
    return a;
    
    var f3 = function() {
      a = f1(arg);
      alert(a); //i.e. "do something" with "a"
    }
    
    success: function(data) {
      a = f2(data);
      f3_callback(a);
    }
    
    您可以这样做:

    var f3 = function() {
      f1(arg);
    }
    var f3_callback = function(a) {
      alert(a); //i.e. "do something" with "a"
    }
    
    因此,您的成功函数如下所示:

    f1(arg, function(data) { 
               var a = f2(data);
               alert(a);
            }
     );
    
    $.ajax({
      ...
      async: false,
      success: ...
    });
    return a;
    
    var f3 = function() {
      a = f1(arg);
      alert(a); //i.e. "do something" with "a"
    }
    
    success: function(data) {
      a = f2(data);
      f3_callback(a);
    }
    

    我希望这是清楚的

    你想把邮件寄到哪里。这是一个重要的问题,这是AJAX。。。您需要使用回调函数使代码正常工作。f2代表什么?也许是回调?没关系,这就解释了:我知道在c#中,任务有异步和等待命令。我不认为你能在JS中做到这一点。如果可以的话,也可以像其他人在这里说的那样进行回调。然而,如果您使用webpack或某些ES(无论现在是什么)编译器,那么您可以使用Promissions。对于ES中的许多新东西来说,这是一个很好的免费资源(6)