【问题标题】:How do you make a function that returns a promise work properly inside of a forEach loop?如何让一个返回 promise 的函数在 forEach 循环中正常工作?
【发布时间】:2016-06-16 04:04:14
【问题描述】:

由于返回 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 是一个返回 promise 的 mongoose 函数,因此在将响应发送回客户端时它不会完全填充数组。

【问题讨论】:

  • “forEach 循环几乎总是会在 promise 返回函数获取或操作的数据完成其数据操作之前完成。” 预期的结果是什么?您可以在问题中加入js 吗?
  • 每个仍然会执行,可能会在不同的时间返回,但它们仍然是单独的调用。
  • 你没有。您使用map 循环,因为forEach 仅适用于不返回任何内容的函数。然后,您可以在结果的 promise 数组上使用 Promise.all
  • 我添加了特定的代码来显示我正在处理的内容。
  • 定义reslistOfItemIdsAndSaleFrequencyProduct

标签: javascript arrays promise


【解决方案1】:

您不能使用forEach 循环,因为它仅适用于不返回任何内容的函数。如果他们返回某些东西或对其作出承诺,您将不得不使用map 循环。然后你可以在结果上使用Promise.all,即promise数组:

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);
})

【讨论】:

【解决方案2】:

这是一个使用 AngularJS 的示例。这个想法是在你的 foreach 循环中建立一个 promise 数组,然后使用 $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);
                    });

【讨论】:

  • 我添加了代码以使我的问题更具体地针对我的情况。
猜你喜欢
  • 2018-04-22
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2013-10-30
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多