【ぷろみす】

Promise とは?

最終更新:
💡 非同期処理の「後で結果を渡す約束書」

非同期処理の「将来の結果」を表すオブジェクト。pending(待機中)・fulfilled(成功)・rejected(失敗)の3つの状態を持つ。

📌 このページのポイント
Promiseの3つの状態 pending 待機中 fulfilled 成功:値 .then(fn) rejected 失敗:理由 .catch(fn) 成功が確定 失敗が確定 成功・失敗が確定すると、元の状態は固定 resolveに別のPromiseを渡すと結果に従う pendingのまま完了しないこともある
矢印は待機中から成功・失敗への状態遷移。thenやcatchは後続処理の登録で、新しいPromiseを返す。resolveの呼び出しと成功の確定は常に同時ではない。
ひよこ ひよこ
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を返すので、元の状態を変えずに後続の結果をつなげられるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
Promiseって出てきたら「非同期処理の結果を包むオブジェクト」と思えばだいたいOK!
📖 おまけ:英語の意味
「Promise」 = 約束
💬 将来の結果を扱う「約束」という名前。必ず完了する保証ではなく、pendingのままになる場合もあるよ

参考資料

← 用語集にもどる