在循环中使用async/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。await``forEach``await
async
await``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,所以我只是想问一下这是否有问题。
await
确保代码确实有效,但是我很确定它不会执行您期望的功能。它只会触发多个异步调用,但printFiles此后函数会立即返回。
printFiles
如果要顺序读取文件, 则不能使用forEach。只需使用现代for … of循环即可,该循环await将按预期工作:
forEach
for … of
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:
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) })); }