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/53241758/

相关文章:

javascript - 如何从 <span>price</span> 中检测并捕获更改(更新)的价格?

javascript - 循环javascript?

javascript - 如何使用 Node js在sql db上插入记录?

node.js - Webpack,require 不是函数

javascript - 处理多个http调用和多个响应

javascript - 使用 Thunk 和 Promise 中间件链接 Promise

javascript - 在 ASP.Net Core 上上传文件返回空 Request.Form.Files,仅在 React 上

node.js - Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数

node.js - 如何从 json 有效负载获取 iframe 以在 pug 中渲染?

javascript - 如何在 JavaScript 中使用 `Array#map` 中的 `Promise.all`