検索

ホームページ  >  に質問  >  本文

async/await および forEach ループを使用して操作する

<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粉010967136P粉010967136472日前551

全員に返信(2)返信します

  • P粉697408921

    P粉6974089212023-08-21 10:27:16

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

    リーリー

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

    簡略化:

    リーリー

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

    返事
    0
  • P粉094351878

    P粉0943518782023-08-21 09:14:18

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

    順番にお読みください

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

    並行読書

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

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

    返事
    0
  • キャンセル返事