JavaScript在forEach中使用async和await是否会有问题?如何使用?现在的问题是,有一个数组,该数组储存文件内容,将await使用在每个文件的内容上,代码如下:
import fs from 'fs-promise'
async function printFiles () {
const files = await getFilePaths() // 假设这里运行正确
files.forEach(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
})
}
printFiles()
但是代码不起作用,有人说不应该在高阶函数中使用async和await,有没有什么办法可以在forEach中使用async和await?
问题分析和解决
上面的代码是正确的,但是不会如期运行,它只是触发了多个异步调用,printFiles函数会在之后立即返回。
1、如果你需要按顺序地读取问题,确实不能使用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);
}
}
2、如果你需要并行地读取问题,也同样不能使用forEach,每个async的回调函数都会返回一个promise,但是这是在抛出这些promise而不是等待。实现并行读取使用map即可解决问题,这样就可以等待到array的promise了,使用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)
}));
}
评论前必须登录!
注册