Javascript 如何在带有NodeJ的for循环中使用异步函数?
我正在使用Nodejs构建一个web scraper,我使用了我编写的许多异步函数。我想使用不同的页面ID运行一系列函数,但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){
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()
。也: