[英]How do you make a function that returns a promise work properly inside of a forEach loop?
由於返回承諾的函數是異步的,您將如何在forEach循環中使用它? forEach循環幾乎總是在由promise返回函數獲取或操縱的數據完成其數據操縱之前完成。
這是我遇到這個問題的一些代碼示例。
var todaysTopItemsBySaleFrequency = [];
listOfItemIdsAndSaleFrequency.forEach((item) => {
Product.findById(item.itemId).then((foundItem) => {
var fullItemData = foundItem.toJSON();
fullItemData.occurrences = item.occurrences;
todaysTopItemsBySaleFrequency.push(fullItemData);
});
});
return res.status(200).json(todaysTopItemsBySaleFrequency);
名為todaysTopItemsBySaleFrequency的數組將被發送回客戶端為空。 findById是一個貓鼬函數,它返回一個Promise,因此在將響應發送回客戶端之前,它並未完全填充數組。
您不能使用forEach
循環,因為該循環僅適用於不返回任何內容的函數。 如果他們返回了某項內容或承諾,則必須使用map
循環。 然后,您可以在結果中使用Promise.all
,並保證使用數組:
Promise.all(listOfItemIdsAndSaleFrequency.map(item =>
Product.findById(item.itemId).then(foundItem => {
var fullItemData = foundItem.toJSON();
fullItemData.occurrences = item.occurrences;
return fullItemData;
})
)).then(todaysTopItemsBySaleFrequency => {
res.status(200).json(todaysTopItemsBySaleFrequency);
})
這是使用AngularJS的示例。 這個想法是在您的foreach循環中建立一個promise數組,然后使用$ q服務來調用它們($ q.all(promiseArray))
var promiseArray = [];
for (var i = 0; i < someArray.length; i++) {
var request = $http({
method: 'GET',
url: url,
});
promiseArray.push(request);
}
$q.all(promiseArray).then(function (data) {
//when all prmises are finished
}, function (err) {
console.log(err);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.