async/await および forEach ループを使用して操作する
P粉010967136
2023-08-20 11:27:20
<p><code>forEach</code> ループ内で <code>async</code>/<code>await</code> を使用することに問題はありますか?ファイルの配列をループし、各ファイルの内容に対して <code>await</code> を使用しようとしています。 </p>
<pre class="brush:php;toolbar:false;">「fs-promise」から fs をインポート
非同期関数 printFiles () {
const files = await getFilePaths() // この関数は正しく動作すると仮定します
files.forEach(async (ファイル) => {
const 内容 = await fs.readFile(file, 'utf8')
コンソール.ログ(内容)
})
}
printFiles()</pre>
<p>このコードは機能しますが、何か問題はありますか?このような高階関数では <code>async</code>/<code>await</code> を使用すべきではないと言われたので、何か質問があれば質問したいと思いました。 </p>
ES2018 を使用すると、上記のすべての答えを大幅に簡素化できます:
リーリー仕様の表示:提案非同期反復
簡略化:
リーリー2018-09-10: この回答は最近多くの注目を集めています。非同期反復の詳細については、Axel Rauschmayer のブログ投稿 を参照してください。
もちろん、コードは機能しますが、期待どおりに機能しないことは確かです。複数の非同期呼び出しをトリガーするだけですが、
printFiles
関数はその直後に戻ります。順番にお読みください
ファイルを順番に読みたい場合、実際には
並行読書forEach
は使用できません。代わりに、最新のfor … of
ループを使用できます。await
は期待どおりに機能します。 リーリーforEach
は使用できません。 async
コールバック関数呼び出しはそれぞれ Promise を返しますが、それを待つのではなく破棄します。代わりに、
mapを使用し、
Promise.all:
を使用して結果の Promise の配列を待つことができます。 リーリー