Node.js:forEach在承诺履行前完成承诺
问题描述:
我试图只在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));
}
答
每当你想与阵列承诺工作,你应该将它们添加到一个数组,然后使用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
});
感谢Abhyudit,你的方法完美。 – Karl