javascript - 将 async/await 与 forEach 循环结合使用

标签 javascript node.js promise async-await ecmascript-2017

forEach 循环中使用 async/await 是否存在任何问题?我正在尝试循环遍历文件数组并 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 ,所以我只是想问是否有任何问题有了这个。

最佳答案

当然,代码确实有效,但我很确定它没有达到您期望的效果。它只是触发多个异步调用,但 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)
  }));
}

关于javascript - 将 async/await 与 forEach 循环结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58014226/

相关文章:

javascript - 在一页上编码多个 fotoramas(在一篇博文中)

Javascript 变量作为 jwplayer 的属性设置

javascript - 合并两个异步请求的数据以应答这两个请求

javascript - 在 NodeJS 中更改 ReadStream 的文件名

javascript - Angular单元测试:模拟多个独立的Promise

javascript - 用 Promise 处理循环

javascript - 如何使用 JS/JQuery 使用文件 :///protocol and IE/Edge browser? 存储持久数据

javascript - Webapi编程暂停或休眠

node.js - Discord Bot 数据库 (JAVASCRIPT)

javascript - 如果第一个 promise 失败,则返回第二个 promise 结果