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

时间:2018-10-02 12:27:57

标签: 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(folderPath))) {
    await fs.mkdir(folderPath);
  }
}

问题是,如果我进行调试,我可以看到forEach中的await被忽略了,并且循环不会等到createFolder方法完成。因此,如果我创建依赖于先前目录的目录,显然会失败。

但是如果我使用for循环,它就可以正常工作(考虑到了等待,并在createFolder完成后继续执行循环):

for (let i = 0; i < remoteFolders.length; i++) {
  if (!localFolders.some(lf => lf === remoteFolders[i])) {
    await this.createFolder(remoteFolders[i]);
  }
}

我可以使用它,但是使用forEach对我来说看起来更优雅。为什么forEach不考虑等待?

2 个答案:

答案 0 :(得分:2)

异步函数一直运行到遇到await,然后返回一个Promise。当您返回承诺时,ForEach不会做任何特别的事情。它所看到的只是您的函数已返回,因此它可以继续进行到数组的下一个元素。因此,forEach会同步地遍历数组,调用一堆函数,并获得一堆被忽略的promise。稍后,promise将开始解决,您的功能将恢复运行,但这是在forEach完成之后。

答案 1 :(得分:0)

使用forEach时,我们指定一个回调函数。此回调将在数组中的每个元素上执行。当使用await时,它将返回一个promise,而不返回其他任何内容。循环继续进行,诺言稍后得到解决。