javascript - 如何使返回 Promise 的函数在 forEach 循环内正常工作?

标签 javascript arrays promise

由于返回 Promise 的函数是异步的,因此如何在 forEach 循环内使用它? forEach 循环几乎总是会在 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 是一个 Mongoose 函数,它返回一个 promise ,因此当响应发送回客户端时它不会完全填充数组。

最佳答案

您不能使用 forEach 循环,因为它仅适用于不返回任何内容的函数。如果他们返回某些内容或对其做出 promise ,您将必须使用 map 循环。然后,您可以对结果(promise 数组)使用 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);
})

关于javascript - 如何使返回 Promise 的函数在 forEach 循环内正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849709/

相关文章:

javascript - Twitter Bootstrap 示例在 IE8 中不工作

javascript - 如何在 JavaScript 中将 float 转换为整数?

java - ArrayException越界

java - 如何确定 Tic Tac Toe 计划的获胜者

javascript - 使用 Promise.all 时,Node_Redis HGET 解析为 bool 数组

javascript - 直接将函数与匿名函数传递给 then Promise 回调

javascript - 为什么我没有收到警告 "a promise was created in a handler but was not returned from it"?

javascript - 重置 Ajax 表单提交上的 Select2 下拉菜单

javascript - 从头开始将 JS 数组传递给 PHP 以获取联系表单

带有数组的 Javascript 过滤器