由于返回承诺的函数是异步的,那么如何在forEach循环中使用它?在承诺返回函数获取或操作数据之前,forEach循环几乎总是会完成它的数据操作。
下面是我遇到这个问题的一些代码的示例。
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是一个猫鼬函数,它返回一个承诺,因此在响应被发送回客户端时,它不会完全填充数组。
发布于 2016-06-15 20:51:13
您不能使用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);
})
发布于 2016-06-15 20:10:47
下面是一个使用AngularJS的示例。其思想是在foreach循环中构建一个承诺数组,然后使用$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);
});
https://stackoverflow.com/questions/37849709
复制