2014-08-27 69 views
0

我已經看到許多問題的答案有關多個延遲正在等待一次,但我有困難等待,然後在觸發最終「完成」事件之前處理這些延遲。考慮下面的代碼,其中我有一個等待的延期列表,然後對於每個延期,我想處理已解決的值,以便在完成所有完成後,我可以將每個延期的結果作爲骨幹集合返回。jQuery多個延遲解決和返回之前處理

我遇到的問題是,在所有deferred.done()lambda完成之前,事件正在被解僱。有什麼方法可以讓這個同步?

(我使用的骨幹機型/收藏和下劃線)

var deferreds = []; 
_.forEach(upcs, function(upc){ 
    deferreds.push(getProduct(upc)); //getProduct() returns a deferred 
}); 

$.when.apply($, deferreds).done(function(){ 
    var products = new Products(); 

    _.forEach(deferreds, function(deferred){ 
     deferred.done(function(product) { //deferred resolve() returns product 
      products.add(product); 
     }); 
    }); 

    that.trigger("claimed", products); //fire fully resolved collection 
}); 
+0

它發生,我認爲這可以通過使用各做()拉姆達內解決deferreds的第二列表是可以實現的,但似乎笨拙對我 – 2014-08-27 13:44:19

+1

http://jsfiddle.net/arunpjohny/m1uLnczv/2/ – 2014-08-27 13:49:59

回答

1

所有承諾的結果可作爲$.when promise's結果。他們給出的arguments到您的處理:

$.when.apply($, deferreds).done(function() { 
    var products = new Products(); 
    _.forEach(arguments, function(product) { 
     products.add(product); 
    }); 
    that.trigger("claimed", products); //fire fully resolved collection 
}); 
+1

我不認爲你會得到一個數組作爲參數...你會得到儘可能多的參數作爲傳遞延期物品..見http:// jsfiddle .net/arunpjohny/m1uLnczv/3/ – 2014-08-27 13:51:07

+0

@ArunPJohny:你是對的。我總是忘記jQuery的'when'是多麼的混亂。 – Bergi 2014-08-27 13:55:29

+0

我明白了,結果被傳回給我的是無形的,謝謝你的幫助! – 2014-08-27 14:01:29