我有以下代码,如果不存在则在本地创建远程文件夹:
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不考虑等待?
答案 0 :(得分:2)
异步函数一直运行到遇到await
,然后返回一个Promise。当您返回承诺时,ForEach不会做任何特别的事情。它所看到的只是您的函数已返回,因此它可以继续进行到数组的下一个元素。因此,forEach会同步地遍历数组,调用一堆函数,并获得一堆被忽略的promise。稍后,promise将开始解决,您的功能将恢复运行,但这是在forEach完成之后。
答案 1 :(得分:0)
使用forEach时,我们指定一个回调函数。此回调将在数组中的每个元素上执行。当使用await时,它将返回一个promise,而不返回其他任何内容。循环继续进行,诺言稍后得到解决。