違いが分からなかったので調べた結果メモ。
Promise.all:
→すべてが resolveされるまで続けるが、1つでも rejectされると終了する
Promise.allSettled:
→すべてがresolveもしくはrejectされるまで続ける
Promise.any:
→1つでも resolveされると終了する
Promise.race:
→1つでも resolveもしくはrejectされると終了する
マラソンに例えると分かりやすい。
・ゴール=resolve
・リタイア=reject
Promise.all:
→全員がゴールするまでレースは続けるけど、途中でリタイアする人が出たら即終了。
(=「ゴールもリタイアもしてないのに途中で中断させられた!」みたいな人が出る可能性がある)
Promise.allSettled:
→全員がゴールもしくはリタイアするまで続ける。
(=レースが強制終了されることはない。現実のマラソン大会と同じ。)
Promise.any:
→1人でもゴールしたら即終了。
(=途中でリタイアする人が出てもレースは終了しない)
Promise.race:
→1人でもゴールまたはリタイアしたら即終了。
anyについては、今現在(2021年4月25日)、以下のような状況らしい。
Promise.any() メソッドは実験的であり、すべてのブラウザーが対応しているわけではありません。現在は TC39 Candidate stage (Stage 4) にあります。
引用:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/any
実験的って書いてますけど、stage4ってことは「100%実装予定だけどまだブラウザで実装されてないだけ」ってことですよね多分。
ステージは0から4まであり、0が単なるアイデアの段階、4が正式な仕様、その間の1〜3が実際に検討が進められている提案です。
使いどころ
以下の2つは分かりやすいですよね。
Promise.all
Promise.allSettled
allSettledのほうは、例えばa,b,cというプロミスを渡して「a,bはresolveしたけどcだけrejectした」みたいな場合に、「じゃあcだけやり直そうか」みたいなのもできるし便利。
Promise.race
は以下のような場合に使えるらしいけど、この場合ってPromise.any
のほうが用途に合ってるのでは?という気が。
キャッシュとサーバからデータ取得する鮮やかなPromise.raceの使い方
おわり
コメント