个性化阅读
专注于IT技术分析

JavaScript如何在forEach中使用async和await?forEach和async、await的结合使用

点击下载

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)
  }));
}
赞(0)
未经允许不得转载:srcmini » JavaScript如何在forEach中使用async和await?forEach和async、await的结合使用

评论 抢沙发

评论前必须登录!