2012-12-12 42 views
6

從本質上講,我特林寫:

var async1 = $.when(a1()).then(function(){ a2() }); 
var async2 = $.when(a3()).then(function(){ a4() }); 

$.when(async1, async2).then(function(){ 
    console.log("complete"); 
}); 

但是,當時A1和A3都執行功能的時刻認爲自己解決。

我放在一起同樣的例子在小提琴:http://jsfiddle.net/Z7fzR/

+0

當你指望* *他們可以解決? –

+0

@ExplosionPills當a1,a2 a3和a4全部解決時,我會期待最終何時解決。如果你關注? – JonWells

+0

只是猜測...如果你改變它,會發生什麼? (a1()。then(function(){a2()}));' –

回答

10

你從來沒有真正恢復的a2()從回調a4()創建的承諾對象;這有效地返回null,這顯然計爲$.when目的的完成:

http://jsfiddle.net/Z7fzR/1/

4

你扔掉的承諾對象是a2a4回報,基本上是通過undefined回到原來的when,它會導致立即解決:

如果一個參數傳遞給jQuery.when並且它不是Deferred,它將被視爲已解析的Deferred,並且將附加任何doneCallbacks立即執行。

添加一些返回,它工作正常。

var async1 = $.when(a1()).then(function(){ return a2(); }); 
var async2 = $.when(a3()).then(function(){ return a4(); }); 

$.when(async1, async2).then(function(){ 
    console.log("complete"); 
}); 

http://jsfiddle.net/Z7fzR/2/