1. ホーム
  2. ジャバスクリプト

[解決済み】Node.jsネイティブのPromise.allは並列処理か逐次処理か?

2022-04-02 18:58:02

質問

この点を明確にしたいと思います。 ドキュメント はあまり明確ではありません。

Q1: Promise.all(iterable) は、すべての約束を順次または並列に処理するのですか?あるいは、より具体的には、次のような連鎖した約束を実行することと同等なのでしょうか?

p1.then(p2).then(p3).then(p4).then(p5)....

それとも他のアルゴリズムで、すべての p1 , p2 , p3 , p4 , p5 などが同時に(並列に)呼び出され、すべてが解決(または1つが拒否)されると同時に結果が返されるのですか?

Q2: もし Promise.all は並列に実行されますが、反復処理可能なものを順次実行する便利な方法はありますか?

備考 : QやBluebirdではなく、すべてネイティブのES6仕様にしたい。

どのように解決するのですか?

<ブロッククオート

Promise.all(iterable) は、すべての約束を実行していますか?

いいえ、約束は実行されません。それらは、それらが実行されるときにタスクを開始します。 作成 - を表すだけであり あなた に渡す前にも、すべてを並列に実行しています。 Promise.all .

Promise.all 待つ 複数のプロミス。それらがどのような順序で解決されるのか、計算が並列で実行されているかは気にしません。

<ブロッククオート

反復処理可能なオブジェクトを順次実行する便利な方法はありますか?

すでにプロミスを持っている場合は、あまりできませんが Promise.all([p1, p2, p3, …]) (これはシーケンスの概念を持ちません)。しかし、非同期関数のイテラブルがあれば、それらを順次実行することは可能です。基本的に、あなたは

[fn1, fn2, fn3, …]

になります。

fn1().then(fn2).then(fn3).then(…)

を使用することであり、その解決策としては Array::reduce :

iterable.reduce((p, fn) => p.then(fn), Promise.resolve())