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);
}
}
【JavaScript如何在forEach中使用async和await(forEach和async、await的结合使用)】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)
}));
}
推荐阅读
- javascript项目使用async报错(regeneratorRuntime is not defined)
- 解决React构建错误(ERROR Module build failed (from .node_modules babel-loader lib index.js))
- Vue-cli 3新建项目报错(ERRORcommand failed npm install –loglevel error —— 解决办法)
- 诺基亚实习面试|诺基亚在校园
- Python中的First Class函数介绍和用法
- 算法设计(最长剩余时间优先(LRTF)CPU调度程序)
- 三星暑期实习研发面试经验|校园班加罗尔
- 堆(heap)数据结构的应用
- AngularJS 动画制作详细实现代码