Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在for循环的下一次迭代之前完成承诺?_Javascript_Node.js - Fatal编程技术网

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

Javascript 在for循环的下一次迭代之前完成承诺?,javascript,node.js,Javascript,Node.js,我肯定这是一个重复的问题。然而,自从我编写javascript以来,这已经是一个很好的时刻,我需要更新如何实现这一点。我试图使用async await,但我使用的特定软件包似乎不允许使用它(或者我很可能错误地使用async await)。我正在使用googletrendsapi。我想等待googleTrends.interestToVertimefetch解析,然后再转到jfor循环的下一次迭代 const dogs = require('./dog_database'); const goog

我肯定这是一个重复的问题。然而,自从我编写javascript以来,这已经是一个很好的时刻,我需要更新如何实现这一点。我试图使用async await,但我使用的特定软件包似乎不允许使用它(或者我很可能错误地使用async await)。我正在使用
googletrendsapi
。我想等待
googleTrends.interestToVertime
fetch解析,然后再转到
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);
                    });
            }
        }
    })();
}
const dogs=require('./dog_数据库');
const googleTrends=require('google-trends-api');
恒力矩=要求的(‘力矩’);
让我们三个月前=时刻()
.减去(3,‘月’)
.format();
对于(i=0;i

如何执行此操作?

在for循环中调用异步函数时使用wait

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

如果你的应用程序中有很多地方你想使用这样的东西,考虑使用支持观察的库。< /P> < P>替换

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

因此,您需要等待结果,并在下一次迭代之前将其放在手中。
但请注意,这不会使DogComparison调用成为同步。。所以打印订单仍然不是你可以信赖的

这是否回答了你的问题?我对你寄给我的东西有点困惑,我只有一个承诺resolve@srb633-如果你只有一个承诺,那么你只有一个品种的狗,不需要它在一个数组中循环。那么你是说为每次迭代定义的每个变量都需要是它自己的承诺?如果让我看一下,会容易得多。我将wait放在异步函数中的fetch旁边。我做错了什么?它在异步函数内部。提取在
j
循环中。你的意思是我需要在异步函数中放置两个循环吗?