2016-11-05 108 views
1

我試圖只在forEach循環內的所有承諾都滿足時才返回結果(feedItemsArray),但是代碼在所有承諾返回前執行。確保所有承諾事先被退回的正確方法是什麼?Node.js:forEach在承諾履行前完成承諾

function retrieveFeed(req, res) { 
    return FeedItem.find().exec() 
    .then(function(feedItems) { 
     var feedItemsArray = []; 
     feedItems.forEach(function(feedItem){ 
      // Do some stuff on feedItem 
      return Comment.find({feedItem_id : feedItem._id}).exec() 
      .then(function(comments){ 
      // Do some stuff on comments 
      return feedItemsArray.push(feedItem); 
      }) 
     }) 
     return prepareJSONObject(feedItemsArray); 
    }) 
    .then(handleEntityNotFound(res)) 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 
} 

回答

2

每當你想與陣列承諾工作,你應該將它們添加到一個數組,然後使用Promise.all()得到的結果一起。

例如:

var arr = ["url1", "url2"]; 
var promises = []; 

// Request is request-promise (returns a promise) 
arr.forEach(function(url) { 
    promises.push(request.get(url)); 
}); 

Promise.all(promises).then(function(results) { 
    // results is an array of results for each url 
}).catch(function(err){ 
    // Even if one fails, you end up here 
}); 
+0

感謝Abhyudit,你的方法完美。 – Karl