forEach ループで async/await を使用する 質問する

forEach ループで async/await を使用する 質問する

ループ内でasync/ を使用すると何か問題がありますか? ファイルの配列と各ファイルの内容をループ処理しようとしています。awaitforEachawait

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ので、これに問題があるかどうかを尋ねたかったのです。

ベストアンサー1

確かにコードは動作しますが、期待どおりには動作しないと思います。複数の非同期呼び出しを実行するだけで、関数はprintFilesその後すぐに戻ります。

順番に読む

ファイルを順番に読み取りたい場合、 indeedは使用できません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);
  }
}

並行して読む

ファイルを並列に読み取りたい場合、 indeedは使用できませんforEach。各asyncコールバック関数呼び出しは promise を返しますが、それらを待機するのではなく破棄します。map代わりに を使用すると、 で取得する promise の配列を待機できます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)
  }));
}

おすすめ記事