【違い】Promise.allSettled、Promise.all、Promise.any、Promise.race

違いが分からなかったので調べた結果メモ。

  • 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が実際に検討が進められている提案です。

引用:ECMAScriptの仕様策定プロセス

使いどころ

以下の2つは分かりやすいですよね。

  • Promise.all
  • Promise.allSettled

allSettledのほうは、例えばa,b,cというプロミスを渡して「a,bはresolveしたけどcだけrejectした」みたいな場合に、「じゃあcだけやり直そうか」みたいなのもできるし便利。

 

Promise.raceは以下のような場合に使えるらしいけど、この場合ってPromise.anyのほうが用途に合ってるのでは?という気が。

キャッシュとサーバからデータ取得する鮮やかなPromise.raceの使い方

 

おわり

コメント

タイトルとURLをコピーしました