Javascript 当我使用for循环时,为什么我的代码不在forEach中等待?

Javascript 当我使用for循环时,为什么我的代码不在forEach中等待?,javascript,node.js,async-await,fs,Javascript,Node.js,Async Await,Fs,我有以下代码,如果远程文件夹不存在,则在本地创建远程文件夹: await remoteFolders .filter(rf => !localFolders.some(lf => lf === rf)) .forEach(async (rf) => await this.createFolder(rf)); 方法createFolder如下所示: async createFolder(folderPath) { if (!(await fs.exists(fold

我有以下代码,如果远程文件夹不存在,则在本地创建远程文件夹:

await remoteFolders
  .filter(rf => !localFolders.some(lf => lf === rf))
  .forEach(async (rf) => await this.createFolder(rf));
方法createFolder如下所示:

async createFolder(folderPath) {
  if (!(await fs.exists(folderPath))) {
    await fs.mkdir(folderPath);
  }
}
问题是,如果我调试,我可以看到forEach中的wait被忽略,循环不会等到createFolder方法完成。因此,如果我创建依赖于以前目录的目录,它显然会失败

但是,如果我使用for循环,它可以正常工作(wait被考虑在内,循环执行在createFolder完成后继续):

for(设i=0;ilf==remoteFolders[i])){
等待这个.createFolder(remoteFolders[i]);
}
}

我可以用这个,但用forEach看起来更优雅。forEach为什么不考虑wait呢?

异步函数运行,直到遇到
wait
,然后返回承诺。当你回报承诺时,ForEach不会做任何特别的事情。它只看到您的函数返回了,因此它可以移动到数组的下一个元素。所以forEach同步地遍历数组,调用一组函数,得到一组它忽略的承诺。稍后,承诺将开始解析,您的函数将恢复运行,但这是在forEach完成之后。

使用forEach时,我们指定了一个回调函数。此回调将在数组中的每个元素上执行。当使用wait时,它只返回一个承诺而不返回其他内容。循环仍在继续,promise将稍后解决。

有没有办法使用forEach编写代码,或者我必须坚持使用classic for loop?@jabko87请看,您可以使用
异步。每个
@sagi Thank都会给它一个trySee@jbialobr
promise。all
允许等待所有文件夹的创建,但不会链接它们
for (let i = 0; i < remoteFolders.length; i++) {
  if (!localFolders.some(lf => lf === remoteFolders[i])) {
    await this.createFolder(remoteFolders[i]);
  }
}