2013-08-31 89 views
0
var xhr1 = $.ajax({ url:'/echo/json/', data:{ delay: 3 } }), 
    xhr2 = $.ajax({ url:'/echo/json/something/invalid', data:{ delay: 3 } }); 

xhr1.always(function(){ 
    console.log('xhr1 always'); 
}); 

xhr2.always(function(){ 
    console.log('xhr2 always'); 
}); 

$.when.apply($, [xhr1, xhr2]).always(function(){ 
    console.log('xhr1 & xhr2 always'); 
}); 

結果(控制檯):deferred.always()觸發太早

xhr2 always 
xhr1 & xhr2 always 
xhr1 always 

爲什麼不deferred.always()等待兩個AJAX調用來完成?是否有任何可以在所有請求完成時使用的回調函數,無論其狀態如何?

http://jsfiddle.net/W9A3f/

+0

您已經在使用'。當()',只需添加'。那麼()'到,你應該有辦法等待所有響應。 – DevlshOne

+0

@DevlshOne我相信只有在兩個調用都成功的情況下才調用'then()'。 – Johan

+0

這是正確的。你是否說OP即使呼叫失敗也想要結果? – DevlshOne

回答

4

.when(...)將觸發其回調時個個resolved,或儘快任何都是rejected

由於第二次AJAX調用導致錯誤,所以只要發生第二次AJAX調用錯誤,第一次AJAX調用是否成功,就會發生.when().always()

我所知道的唯一解決方案就是針對每個AJAX請求保留第二個$.Deferred,然後在每個AJAX請求的always處理程序中保留這些處理器的resolve。然後在您的通話$.when使用那些 deferreds:

var def1 = $.Deferred(); 
xhr1.always(def1.resolve); 

var def2 = $.Deferred(); 
xhr2.always(def2.resolve); 

$.when(def1, def2).done(function() { 
    // only called when the two XHRs complete, whether 
    // they succeeded or not 
}); 
+0

那麼,有什麼辦法可以做一個同步回調? – Johan

+0

@Johan我已經添加了 – Alnitak