通过forEach循环使用async / await

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 (let 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)
  }));
}

对我来说,使用Promise.all()map()有点难以理解和详细,但如果你想用普通的JS来完成这是你最好的选择。

如果你不介意添加一个模块,我实现了数组迭代方法,以便通过async / await以非常简单的方式使用它们。

以您的案例为例:

const { forEach } = require('p-iteration');
const fs = require('fs-promise');

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

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

printFiles()

对迭代


以下是一些forEach异步原型:

Array.prototype.forEachAsync = async function (fn) {
    for (let t of this) { await fn(t) }
}

Array.prototype.forEachAsyncParallel = async function (fn) {
    await Promise.all(this.map(fn));
}
链接地址: http://www.djcxy.com/p/82681.html

上一篇: Using async/await with a forEach loop

下一篇: Async/await as a replacement of coroutines