我正在编写一个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的数组,但是当我将其返回给客户端时为什么它为空?

最佳答案

您传递给Product.findById(item.itemId).then(...)的回调函数不会立即被调用。您的外部forEach完成并且您return在调用任何回调之前。

猫鼬的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));

关于javascript - 串联使用forEach和mongoose的findById时遇到问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37848128/

10-09 17:51