2012-01-27 136 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); 
} 

我希望這是明確的!