async/await および forEach ループを使用して操作する
P粉010967136
P粉010967136 2023-08-20 11:27:20
0
2
539
<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>
P粉010967136
P粉010967136

全員に返信(2)
P粉697408921

ES2018 を使用すると、上記のすべての答えを大幅に簡素化できます:

リーリー

仕様の表示:提案非同期反復

簡略化:

リーリー

2018-09-10: この回答は最近多くの注目を集めています。非同期反復の詳細については、Axel Rauschmayer のブログ投稿 を参照してください。

いいねを押す +0
P粉094351878

もちろん、コードは機能しますが、期待どおりに機能しないことは確かです。複数の非同期呼び出しをトリガーするだけですが、printFiles 関数はその直後に戻ります。

順番にお読みください

ファイルを順番に読みたい場合、実際には forEach は使用できません。代わりに、最新の for … of ループを使用できます。await は期待どおりに機能します。 リーリー

並行読書

ファイルを並行して読み取りたい場合、実際には

forEach は使用できません。 async コールバック関数呼び出しはそれぞれ Promise を返しますが、それを待つのではなく破棄します。代わりに、map を使用し、Promise.all: を使用して結果の Promise の配列を待つことができます。 リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート