できない.dev

Promise

別名: プロミス / promise

Promise は非同期処理の最終的な完了または失敗と、その結果の値を表す JavaScript のオブジェクト。pending から fulfilled / rejected へ一度だけ状態遷移し、then や async/await で結果を受け取る。

公開:

定義

Promise は、非同期処理の「まだ結果が出ていない値」を表す JavaScript の組み込みオブジェクトである。
生成直後は pending(未確定)で、処理が成功すると fulfilled、失敗すると rejected一度だけ 状態が変わる。
確定後の状態と値は変化しない。

詳細

結果は then() / catch() / finally() で受け取るか、async 関数の中で await して同期的に見える形で扱う。
複数の Promise は Promise.all() でまとめて待てる。fetch やタイマー、ファイル入出力など時間のかかる API の多くが Promise を返す。await はこの確定を待つだけなので、Promise でない値を待っても即座に返る。

よくある誤解

Promise を作った時点では処理は「予約」されるだけで、値そのものではない。
JSX に Promise を直接埋め込むと Objects are not valid as a React child のように描画エラーになる。
また await を付け忘れると、値ではなく Promise オブジェクトのまま後続処理へ渡ってしまう。

関連

同期的な書き方を可能にするのが async/await で、失敗時の理由は reject された値として伝わる。
サーバ処理が確定を待てずに終わる例は Vercel の関数がタイムアウトする を参照。