【ぷろみす】
Promise とは?
💡 非同期処理の「後で結果を渡す約束書」
📌 このページのポイント
- Promiseは「成功したらthen、失敗したらcatch」という形でコールバックを登録する
- 複数のPromiseをPromise.all()で並列実行、Promise.race()で最速を取得できる
- 一度fulfilled/rejectedになったPromiseは状態が変わらない(イミュータブル)
- async/awaitはPromiseを扱いやすくした構文で、内部はPromiseと同じ
Promiseって何を「約束」してるの?
コールバックじゃダメなの?
コールバックをネストすると「コールバック地獄」になって読みにくくなる。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 コンストラクタアンチパターン」は実際の現場でよく見かける問題なんだ。
📖 おまけ:英語の意味
「Promise」 = 約束
💬 「今はないけど、後で結果を渡すことを約束する」というニュアンス。将来の値の「約束手形」