この点を明確にしておきたいと思います。ドキュメンテーションそれについてはあまり明確ではありません。
Q1:すべてのプロミスは順番に処理されますか、それとも並列に処理されますかPromise.all(iterable)
? あるいは、より具体的には、次のような連鎖プロミスを実行するのと同じですか?
p1.then(p2).then(p3).then(p4).then(p5)....
それともp1
、、、、、などが同時に(並列に)呼び出され、すべてが解決されると(または 1 つが拒否されると)すぐに結果が返されるような、他p2
の種類のアルゴリズムですか?p3
p4
p5
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())