当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]

Posted

技术标签:

【中文标题】当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]【英文标题】: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?

【问题讨论】:

见***.com/questions/37576685/… @jbialobr Promise.all 允许等待所有文件夹的创建,但不链接它们 【参考方案1】:

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

【讨论】:

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

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

【讨论】:

以上是关于当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用多处理/多线程的函数在 for 循环中使用时如此缓慢,但在循环之外却没有?

为啥我不使用 for 循环时会发生正确的碰撞,但是当我使用 for 循环时只有 1 个对象有碰撞?

为啥for循环在c中无限进行

为啥'for'循环条件失败? [复制]

为啥基于范围的 for 循环不修改容器元素?

Java for 循环没有在我的代码中终止