【ぷろみす】
Promise とは?
最終更新:
💡 非同期処理の「後で結果を渡す約束書」
非同期処理の「将来の結果」を表すオブジェクト。pending(待機中)・fulfilled(成功)・rejected(失敗)の3つの状態を持つ。
📌 このページのポイント
- 成功時はthen、失敗時はcatchなどで後続の処理を登録する
- Promise.allは全成功を待ち、raceは最初の成功または失敗を採用する
- fulfilledまたはrejectedになると、そのPromiseの状態は変わらない
- async関数はPromiseを返し、awaitで結果を待って扱える
Promiseって何を「約束」してるの?
非同期処理の成功した値や失敗の理由を、後続の処理で扱える形に包むんだ。待機中のpendingからfulfilledかrejectedになったときに、登録した処理が呼ばれる。ただし、ずっとpendingのままになるPromiseもあるよ。
コールバックじゃダメなの?
Promiseもthenやcatchでコールバックを登録するよ。処理をチェーンでつなぎ、成功した値やエラーを次の処理へ渡せるので、深い入れ子を減らしやすい。async関数とawaitを使うと、順番に処理する形で書けるんだ。
Promise.allとPromise.raceって何が違うの?
allはすべてが成功すると値の配列を返し、一つが失敗すると失敗するよ。raceは最初に確定した成功または失敗を採用する。処理を開始するのは呼び出した関数などで、allに渡したから並列実行が始まるわけではないんだ。
raceでタイムアウトにしたら、通信も止まる?
raceの結果が確定しても、ほかの処理は自動では止まらないよ。allの失敗も同じ。通信を中止したいなら、そのAPIが対応するAbortControllerなど、元の処理を止める仕組みを使うんだ。
resolveを呼ぶと、すぐ成功になるの?
普通の値を渡せば、その値でfulfilledになるよ。ただし別のPromiseなどを渡すと、その結果に従うので、まだpendingのこともある。rejectは失敗の理由を確定する。thenなどは新しいPromiseを返すので、元の状態を変えずに後続の結果をつなげられるんだ。
📖 おまけ:英語の意味
「Promise」 = 約束
💬 将来の結果を扱う「約束」という名前。必ず完了する保証ではなく、pendingのままになる場合もあるよ