【違い】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の使い方

 

おわり

HTML/CSS/JavaScript
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。
2019年くらいからフロントエンドエンジニアを目指している元アフィリエイターです💩

penpenをフォローする
penpenをフォローする
penpenメモ

コメント

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