【问题标题】:Why is my code not awaiting in a forEach when it works when I use a for loop? [duplicate]当我使用 for 循环时,为什么我的代码没有在 forEach 中等待? [复制]
【发布时间】:2019-03-07 13:56:02
【问题描述】:

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

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-loop,它可以正常工作(考虑到 await 并在 createFolder 完成后继续执行循环):

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

我可以使用这个,但使用 forEach 对我来说看起来更优雅。为什么 forEach 不考虑 await?

【问题讨论】:

标签: javascript node.js async-await fs


【解决方案1】:

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

【讨论】:

  • 还有什么方法可以选择如何使用 forEach 编写我的代码,或者我必须坚持使用经典的 for 循环?
  • @jabko87 看stackoverflow.com/questions/5050265/…,你可以用async.each
  • @sagi 谢谢会试一试
【解决方案2】:

在使用 forEach 时,我们指定了一个回调函数。此回调将在数组中的每个元素上执行。当使用 await 时,它返回一个 Promise 而没有别的。循环继续,promise 稍后解决。

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 2022-01-04
    • 2015-07-11
    • 2013-08-12
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多