在下一次for循环迭代之前完成承诺?

时间:2020-10-20 14:34:54

标签: javascript node.js

我确定这是一个重复的问题。但是,自从我写了javascript以来,这已经是一个好时机,并且需要有关如何实现此目的的更新。我试图使用异步等待,但是我使用的特定程序包似乎不允许它(或者我很可能不正确地使用了异步等待)。我正在使用google-trends-api。我想等待googleTrends.interestOverTime的获取解决后再移至j for循环的下一个迭代。

const dogs = require('./dog_database');
const googleTrends = require('google-trends-api');
const moment = require('moment');

let threeMonthsAgo = moment()
    .subtract(3, 'months')
    .format();

for (i = 0; i < dogs.breeds.length; i++) {
    let currentDog = dogs.breeds[i];

    (async function dogComparision() {
        for (j = 0; j < dogs.breeds.length; j++) {
            let dogBeingCompared = dogs.breed[j];

            if (dogBeingCompared === currentDog) {
                console.log('Just passed current dog.');
            } else {
                // this is the fetch
                await googleTrends
                    .interestOverTime({keyword: [currentDog, dogBeingCompared], startTime: new Date(threeMonthsAgo)})
                    .then(function(results) {
                        console.log(results.default.averages);
                    })
                    .catch(function(err) {
                        console.error('Error returned', err);
                    });
            }
        }
    })();
}

我该怎么办?

2 个答案:

答案 0 :(得分:0)

在for循环中调用异步函数时,请使用await。

如果您的应用程序中有很多地方想要使用类似的东西,请考虑使用支持Observables的库。

答案 1 :(得分:0)

替换

await googleTrends
                    .interestOverTime({keyword: [currentDog, dogBeingCompared], startTime: new Date(threeMonthsAgo)})
                    .then(function(results) {
                        console.log(results.default.averages);
                    })
                    .catch(function(err) {
                        console.error('Error returned', err);
                    });

使用:

    let results = googleTrends.interestOverTime({keyword: [currentDog, dogBeingCompared], startTime: new Date(threeMonthsAgo)})
                          .catch(function(err) {
                            console.error('Error returned', err);
                        });
    console.log(results.default.averages);
                       
     

因此,您等待结果,并在下一次迭代之前将其准备好。 但是请注意,这不会使dogComparision的调用保持同步..因此打印顺序仍然不是您可以依靠的

相关问题