Javascript 如何在带有NodeJ的for循环中使用异步函数?

Javascript 如何在带有NodeJ的for循环中使用异步函数?,javascript,node.js,for-loop,asynchronous,Javascript,Node.js,For Loop,Asynchronous,我正在使用Nodejs构建一个web scraper,我使用了我编写的许多异步函数。我想使用不同的页面ID运行一系列函数,但for循环似乎无法正常工作。我也尝试过使用计数器变量,但它没有产生所需的结果。。请在下面找到我的代码: var pageInformation = [ ['page1','id111'], ['page2','id222'], ['page3','id333']]; var reqCounter = 0; for(page in pageInformation){

我正在使用Nodejs构建一个web scraper,我使用了我编写的许多异步函数。我想使用不同的页面ID运行一系列函数,但for循环似乎无法正常工作。我也尝试过使用计数器变量,但它没有产生所需的结果。。请在下面找到我的代码:

var pageInformation = [
['page1','id111'],
['page2','id222'],
['page3','id333']];

var reqCounter = 0;

for(page in pageInformation){
    var pageName = pageInformation[reqCounter][0];
    var pageId = pageInformation[reqCounter][1]
    getPosts(pageId,function(err,idArray){
        if(!err){
            getMoreData(idArray, function(data,err){
                if(!err){
                    populateDatabase(data, function(err,success){
                        if(!err){
                        reqCounter++;
                            console.log('Loop for ' + pageName + 'has finished');//prints out page1 three times 
                        }
                    })
                }
            })
        }
    })    
}

所发生的事情是console.log()将page1打印三次,并且数据库只填充第一页数据。关于如何为pagesInformation数组中的每个页面运行此代码链,有什么想法吗

您的
for
循环同步运行,而
reqCounter
仅在每个异步调用完成时递增。这意味着在每次迭代中,
reqCounter
仍将是
0

此外,用
var
声明的变量不是块作用域,而是作用域到当前函数。这意味着
pageName
pageId
将在每个迭代中重新分配,而不是每个迭代都有自己的变量版本

后一个问题可以通过使用
let
const
声明这些变量来解决,因为这使它们具有块作用域,即每个迭代都有自己的版本。由于您从未重新分配它们,
const
是合适的

对于第一个问题,我不明白为什么您首先需要
reqCounter
。只需使用迭代器变量
页面

最后,在数组上使用
for…in
循环是个坏主意,因为这很容易导致错误和意外行为。您应该改用
for…of
forEach()

因此,我对您的问题的解决方案是更改以下三行:

for(page in pageInformation){
    var pageName = pageInformation[reqCounter][0];
    var pageId = pageInformation[reqCounter][1]
为此:

for (const page of pageInformation) {
    const pageName = page[0];
    const pageId = page[1];

1.不要在中对数组中的…使用
。2.检查
(等待x/y)
语法。
reqCounter++
在您认为它运行时没有运行。查看
Promise.all()
。也: