一尘不染

JavaScript在forEach循环中使用异步/等待

javascript

在循环中使用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,所以我只是想问一下这是否有问题。


阅读 2732

收藏
2020-04-22

共1个答案

一尘不染

确保代码确实有效,但是我很确定它不会实现您期望的功能。它只会触发多个异步调用,但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

async function printFiles () {
  const files = await getFilePaths();

  await Promise.all(files.map(async (file) => {
    const contents = await fs.readFile(file, 'utf8')
    console.log(contents)
  }));
}
2020-04-22