由于返回promise的函数是异步的,你如何在forEach循环中使用它? forEach循环几乎总是在promise数据被提取或操作之前完成,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的mongoose函数,因此在响应发送回客户端时它不会完全填充数组。
答案 0 :(得分:1)
您不能使用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);
})
答案 1 :(得分:0)
以下是使用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);
});