我正在编写一个Node路由,它应该在对象添加了一个属性后将对象推送到在forEach循环之外声明的数组。当我在循环中的console.log数组时,它似乎正在接受数据,但是当我将它返回给客户端时。它是空的。
var todaysTopItemsBySaleFrequency = [];
listOfItemIdsAndSaleFrequency.forEach((item) => {
Product.findById(item.itemId).then((foundItem) => {
var fullItemData = foundItem.toJSON();
fullItemData.occurrences = item.occurrences;
todaysTopItemsBySaleFrequency.push(fullItemData);
console.log(todaysTopItemsBySaleFrequency);
});
});
return res.status(200).json(todaysTopItemsBySaleFrequency);
console.log语句显示正在正确填充名为todaysTopItemsBySaleFrequency的数组,但是当我将其返回给客户端时为什么它是空的?
答案 0 :(得分:1)
不会立即调用您传递给Product.findById(item.itemId).then(...)
的回调函数。在调用任何回调之前,您的外forEach
完成,return
完成。
Mongoose的findById()
方法returns a promise。您可以使用Promise.all()
等待一系列承诺完成,然后设置res.status(200).json(...)
。因为这是异步发生的,所以您还应该提供一个异步接口,例如通过自己返回一个promise。
这是一个收集所有响应的版本,并返回一个以原始返回值结算的承诺:
var todaysTopItemsBySaleFrequency = [];
return Promise.all(listOfItemIdsAndSaleFrequency.map((item) => {
return Product.findById(item.itemId).then((foundItem) => {
var fullItemData = foundItem.toJSON();
fullItemData.occurrences = item.occurrences;
todaysTopItemsBySaleFrequency.push(fullItemData);
console.log(todaysTopItemsBySaleFrequency);
});
})).then(() => res.status(200).json(todaysTopItemsBySaleFrequency));