如何在forEach循环中创建一个返回promise的函数?

时间:2016-06-16 04:04:14

标签: javascript arrays promise

由于返回promise的函数是异步的,你如何在forEach循环中使用它? forEach循环几乎总是在promise数据被提取或操作之前完成,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函数,因此在响应发送回客户端时它不会完全填充数组。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

以下是使用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);
                    });