Node.js ネイティブの Promise.all は並列処理ですか、それとも順次処理ですか? 質問する

Node.js ネイティブの Promise.all は並列処理ですか、それとも順次処理ですか? 質問する

この点を明確にしておきたいと思います。ドキュメンテーションそれについてはあまり明確ではありません。

Q1:すべてのプロミスは順番に処理されますか、それとも並列に処理されますかPromise.all(iterable)? あるいは、より具体的には、次のような連鎖プロミスを実行するのと同じですか?

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

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

Q2:並列で実行する場合Promise.all、反復可能オブジェクトを順番に実行する便利な方法はありますか?

: Q や Bluebird ではなく、すべてのネイティブ ES6 仕様を使用します。

ベストアンサー1

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

いいえ、Promise は「実行」できません。Promise は作成されるときにタスクを開始し、結果のみを表します。また、Promise を に渡す前でもすべてを並列に実行しますPromise.all

Promise.all複数のプロミスを待機するだけです。プロミスがどのような順序で解決されるか、または計算が並列で実行されているかどうかは考慮されません。

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

すでにPromiseを持っている場合、(シーケンスの概念がないので)できることはあまりありません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())

おすすめ記事