当我使用 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/… @jbialobrPromise.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 循环中使用时如此缓慢,但在循环之外却没有?