簡體   English   中英

您如何使返回承諾的函數在forEach循環中正常工作?

[英]How do you make a function that returns a promise work properly inside of a forEach loop?

由於返回承諾的函數是異步的,您將如何在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,因此在將響應發送回客戶端之前,它並未完全填充數組。

您不能使用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);
})

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM