使用async/await与forEach循环结合

发布时间 2023-10-30 22:33:11作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=使用async/await与forEach循环结合

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


当然,这段代码确实可以工作,但我确信它并没有按照你的期望来执行。它只是触发了多个异步调用,但在那之后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等待你将获得一个包含所有promise的数组:

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

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