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

関連する問題