Heim > Fragen und Antworten > Hauptteil
P粉6974089212023-08-21 10:27:16
使用ES2018,您可以大大简化上述所有答案:
async function printFiles () { const files = await getFilePaths() for await (const contents of files.map(file => fs.readFile(file, 'utf8'))) { console.log(contents) } }
简化后:
for await (const results of array) { await longRunningTask() } console.log('I will wait')
2018-09-10:最近这个答案引起了很多关注,请参阅Axel Rauschmayer的博客文章以获取有关异步迭代的更多信息。
P粉0943518782023-08-21 09:14:18
当然,代码确实可以工作,但我很确定它不会按照你的期望工作。它只是触发了多个异步调用,但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
回调函数调用都会返回一个promise,但你却将它们丢弃而不是等待它们。相反,你可以使用map
,并使用Promise.all
等待得到的promise数组:
async function printFiles () { const files = await getFilePaths(); await Promise.all(files.map(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) })); }