使用有什么问题吗async
/await
in a forEach
环形?我正在尝试循环遍历文件数组并await
关于每个文件的内容。
import fs from 'fs-promise'
async function printFiles () {
const files = await getFilePaths() // Assume this works fine
files.forEach(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
})
}
printFiles()
这段代码确实有效,但是会出现什么问题吗?我有人告诉我你不应该使用async
/await
在这样的高阶函数中,所以我只是想问一下这是否有任何问题。
当然,代码确实有效,但我很确定它没有达到您期望的效果。它只是触发多个异步调用,但是printFiles
之后函数立即返回。
按顺序阅读
如果你想按顺序读取文件,你不能使用forEach
的确。只需使用现代for … of
而是循环,其中await
将按预期工作:
async function printFiles () {
const files = await getFilePaths();
for (const file of files) {
const contents = await fs.readFile(file, 'utf8');
console.log(contents);
}
}
并行阅读
如果你想并行读取文件,你不能使用forEach
的确。每一个async
回调函数调用确实返回一个承诺,但您将它们扔掉而不是等待它们。只需使用map
相反,你可以等待你将得到的一系列承诺Promise.all
:
async function printFiles () {
const files = await getFilePaths();
await Promise.all(files.map(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
}));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)