2016-11-05 72 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