【ぷろみす】

Promise とは?

💡 非同期処理の「後で結果を渡す約束書」
📌 このページのポイント
Promiseの3つの状態 Pending 待機中 new Promise() resolve(値) reject(エラー) Fulfilled 成功(値を持つ) Rejected 失敗(エラーを持つ) 確定済み チェーン処理 .then(fn) 成功時に実行 .catch(fn) 失敗時に実行 状態は一度確定すると 変更できない
Promiseの状態遷移
ひよこ ひよこ

Promiseって何を「約束」してるの?

ペンギン先生 ペンギン先生

「今すぐ値は渡せないけど、後で成功か失敗かを必ず通知するよ」という約束だよ。APIを叩くとPromiseが返ってきて、通信が終わったら.then()で成功時の処理、.catch()で失敗時の処理が呼ばれる。

ひよこ ひよこ

コールバックじゃダメなの?

ペンギン先生 ペンギン先生

コールバックネストすると「コールバック地獄」になって読みにくくなる。Promiseなら.then()をチェーンして縦に並べられるから読みやすくなる。さらにasync/awaitにすれば同期コードに近い見た目で書けるんだ。

ひよこ ひよこ

Promise.allとPromise.raceって何が違うの?

ペンギン先生 ペンギン先生

Promise.allは全部成功するまで待って、1つでも失敗したら全体が失敗になる。Promise.raceは一番早く終わったものの結果を使う。タイムアウト処理を実装するときに「実際の処理」と「一定時間後にrejectするPromise」をraceさせるのが定番パターンだよ。

ひよこ ひよこ

Promiseをnewするとき何でresolveとrejectを渡すの?

ペンギン先生 ペンギン先生

「new Promise((resolve, reject) => {...})」の形はPromiseコンストラクタパターンと呼ばれる。成功時にresolve(値)を呼ぶとfulfilled、失敗時にreject(エラー)を呼ぶとrejectedになる。でも既存のコールバックAPIをPromise化するとき以外、このパターンを使う必要はほぼない。async/awaitで書けばreturnがresolve、throwがrejectに対応するから。不必要にPromiseコンストラクタを使う「Promise コンストラクタアンチパターン」は実際の現場でよく見かける問題なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
Promiseって出てきたら「非同期処理の結果を包むオブジェクト」と思えばだいたいOK!
📖 おまけ:英語の意味
「Promise」 = 約束
💬 「今はないけど、後で結果を渡すことを約束する」というニュアンス。将来の値の「約束手形」
← 用語集にもどる