麻烦使用forEach和mongoose的findById串联

时间:2016-06-16 00:49:39

标签: javascript node.js mongoose

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

1 个答案:

答案 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));