2013-03-12 69 views
0

試圖使用$ .Deferreds代替之前使用的setTimeOut。 我遇到了一個問題,因爲writer()實際上並未完成,因爲$ .each在調用printer()時仍然循環。

我還沒有看到$ .Deferreds與循環的例子。顯然,以下是錯誤的,我敢打賭,這與決心有關 - 任何幫助將不勝感激。

$.when(writer()).done(function() { 
    printer(); 
}); 


function writer(){ 
    var deferred = new $.Deferred(); 
    if(x){ 
     $("a").each(function() {...}); 
    } 
    if(y){ 
     $("img").each(function() {...}); 
    } 
    if(z){ 
     $("div").each(function() {...}); 
    } 
    deferred.resolve(); 
    return deferred.promise(); 

} 

function printer(){...} 
+0

想想看,你總是解決它返回它之前,所以'.done'在調用'writer'之後總是會立即發生,無論您的'.each'中是否存在異步事件。如果你沒有在'$ .each'中做任何異步工作,你不需要延遲對象。 – 2013-03-12 14:30:43

+0

@KevinB - 這正是我想到的情況,只是不確定如何在觸發打印機之前返回多個延遲() – Jason 2013-03-12 14:35:25

+0

無關,但爲什麼要在最多隻能包含最多的jQuery對象上調用'.each()'一個元素? – 2013-03-12 14:36:06

回答

0

假設....each內部正在做一個異步事件,你需要所有的異步事件的返回延期對象,您可以傳遞到$.when觸發你的決心。

此外,在你的代碼的頂部,你不需要爲$.when一個回調,只是做writer().done(function(){...})

+0

看到更新 - $ .each被封裝在一個if - 那麼如何返回$ .each中的延期並確保所有返回的都是真的? – Jason 2013-03-12 14:33:22