Node.js:forEach包含在履行承诺之前完成的承诺

时间:2016-11-05 10:25:44

标签: javascript node.js

我只是在完成forEach循环中的所有promise时才尝试返回结果(feedItemsArray),但是在返回所有promise之前执行代码。确保事先退回所有承诺的正确方法是什么?

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)); 
}

1 个答案:

答案 0 :(得分:3)

每当你想在数组上使用promises时,你应该将它们添加到数组中,然后使用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
});