我确定这是一个重复的问题。但是,自从我写了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);
});
}
}
})();
}
我该怎么办?
答案 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的调用保持同步..因此打印顺序仍然不是您可以依靠的