2014-11-24 76 views
-1

如何在循環的最後一個承諾完成後解決此承諾?NodeJS在完成循環後解析承諾

var foo = function(JSONArray){ 
    return new Promise(function(resolve,reject){ 
     for(var i=0; i < JSONArray.length; i++){ 
      doIntensiveWork(JSONArray[i]) 
      .then(doMoreIntensiveWork) //returns a promise 
     } 

     //resolve() after every promise from the loop is fulfilled 
    }) 
} 

我用Bluebird

+3

' - >'https://github.com/petkaantonov/bluebird/blob/master/API.md#all---promise – 2014-11-24 16:27:27

+0

我覺得青鳥文檔給予足夠的這個解釋更。查看庫中所有酷炫的收集方法,我想你會發現它們非常強大。 – thataustin 2014-11-25 02:36:49

回答

0

您可以使用Promise#each

var foo = function(jsonArray){ 
    return Promise.each(jsonArray, doIntensiveWork).each(doMoreIntensiveWork); 
}); 
+0

在開始第一個'doMoreIntensiveWork'之前,這是否會等待所有'doIntensiveWork'? – Bergi 2014-11-24 18:37:39

+0

@Bergi是公平的我不記得了,這裏完全有可能存在一個優化(比如'.map'),或者Petka選擇不實現它。無論哪種方式,對我來說這聽起來不是什麼大問題,因爲OP想根據原始代碼等待所有工作按順序完成,我認爲這需要花費很長時間。 – 2014-11-24 18:39:29

3

隨着bluebird

var foo = function(array) { 
    return new Promise.map(array, function(element) { 
     return doIntensiveWork(element).then(doMoreIntensiveWork); 
    }); 
}; 

foo(['bar', 'baz']) 
.then(function(returnedValues) { 
    // returnedValues is an array containing all values 
    // return by your intensive work in foo 
}); 
+0

'Promise.map'同時運行,不會保留迭代次序,並且通常不會執行OP的原始代碼(減去不正確的返回值)。 – 2014-11-24 18:29:09

+0

@BenjaminGruenbaum:我沒有看到OP中有任何跡象表明這項工作不應該同時完成。 'Promise.map'似乎只是去這裏的路。 – Bergi 2014-11-24 19:37:45

+0

我不知道'map'沒有保存順序。關於併發性,可以用'... map(...,{concurrency:1});'來設置。如果退貨訂單很重要,他可以使用「全部」。 – 2014-11-25 21:00:00