ループ内でasync
/ を使用すると何か問題がありますか? ファイルの配列と各ファイルの内容をループ処理しようとしています。await
forEach
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
ので、これに問題があるかどうかを尋ねたかったのです。
ベストアンサー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)
}));
}