在 forEach 循环中使用 async/await

摘要:在循环中使用async/有什么问题吗?我正在尝试遍历文件数组和每个文件的内容。这段代码确实有效,但会不会有什么问题?有人告诉我你不应该在这样的高阶函数中使用async/ await,所以我只是想问问这是否有任何问题。

问题:

在循环中使用async/有什么问题吗?我正在尝试遍历文件数组和每个文件的内容。

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,所以我只是想问问这是否有任何问题。


答案:

当然代码确实有效,但我很确定它不会做你期望它做的事情。它只是触发多个异步调用,但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)
  }));
}


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_10709