2012-01-27 135 views
7

比如我有一个函数:返回AJAX回调返回

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

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

我怎样才能在f1 AJAX后返回a得到data

+0

你想在哪里发送一个。这是重要的问题 – Baz1nga 2012-01-27 23:16:39

+0

它是** A ** JAX ...你需要使用回调函数来使你的代码工作。 – 2012-01-27 23:17:24

回答

15

由于请求是异步的(并且同步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); 
     } 
); 
+0

精彩回答 – merveotesi 2012-08-24 07:37:19

+0

f2代表什么?也许是回调? – Rodent 2015-12-22 15:03:32

+0

没关系,这解释了它:http://stackoverflow.com/questions/14754619/jquery-ajax-success-callback-function-definition – Rodent 2015-12-22 15:08:54

2

简短,简单的答案:不能。

可能使a是一个全球性的,但你是受时机问题。

不如之一:

  1. 传递一个回调在阿贾克斯成功运行,或
  2. 使用jQuery的.when/.then construct,或
  3. 只是做回调的工作。
  4. (是的,你可以拨打电话同步的。请不要。)
0

要做到这一点,最简单的方法是使Ajax调用同步。在你的f1函数中,用async:false设置ajax调用,以便函数不会继续,直到调用完成并返回数据。

0

您似乎需要使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); 
} 

我希望这是明确的!