Promise
公開日: 2025/06/02
Promiseとは?──JavaScriptの非同期処理をシンプルに制御する仕組み
はじめに
JavaScript で API を呼び出したり、ファイルを読み込んだりする処理を書いていると、次の処理を“いつ”“どうやって”実行するかが問題になります。
かつては「コールバック地獄(callback hell)」がその代表例でした。
それを救ったのが Promise(プロミス) という仕組みです。
本記事では、Promise の基本概念、使い方、設計メリット、
async/await
との関係までを解説します。
基本情報・概要
Promise は、非同期処理の最終的な完了(成功)または失敗(エラー)を表すオブジェクトです。
状態と結果を管理しながら、処理の順序制御を可能にするAPIです。
主な特徴:
- 非同期処理の成功/失敗を明確に扱える
/.then()
/.catch()
で流れるような制御が可能.finally()
- コールバックよりもネストが浅く、可読性が高い
Promise は「非同期処理の結果を“未来の値”として扱うオブジェクト」です。
比較・分類・特徴の表形式まとめ(任意)
比較対象 | 特徴 | 問題点/特徴 |
---|---|---|
コールバック | 関数を引数に渡す | ネストが深くなりがち、エラー処理が難しい |
Promise | then/catchで処理フローを構造化 | 可読性が高く、エラーも捕捉しやすい |
async/await | Promiseをより直感的に使える構文 | 内部的にはPromiseがベース。try/catchが必要 |
Promise はコールバックの混乱から生まれた“秩序ある非同期”の形です。
深掘り解説
✅ 基本構文
const myPromise = new Promise((resolve, reject) => { const success = true; if (success) { resolve("成功しました!"); } else { reject("失敗しました。"); } }); myPromise .then(result => { console.log(result); // => 成功しました! }) .catch(error => { console.error(error); });
:成功時に呼び出すresolve()
:失敗(エラー)時に呼び出すreject()
:成功時の処理.then()
:失敗時の処理.catch()
:成否に関係なく最後に実行.finally()
✅ Promiseチェーンの活用
fetch("/api/user") .then(res => res.json()) .then(user => { return fetch(`/api/orders?user=${user.id}`); }) .then(res => res.json()) .then(orders => { console.log("注文一覧", orders); }) .catch(err => { console.error("エラー:", err); });
- 順次処理をネストせずに記述可能
- エラーハンドリングはまとめて
に集約できる.catch()
応用・発展的な使い方
- Promise.all():複数の非同期処理を並列に実行・完了を待機
- Promise.race():最初に終わったPromiseを採用
- 非同期関数との併用(async/await):直感的にPromiseを制御
- カスタムユーティリティ作成:遅延、タイムアウト、リトライ処理など
Promiseは構造化された“非同期の文法”を作るための基盤技術です。
よくある誤解と注意点(任意)
- “非同期処理=Promise”ではない:非同期には
やイベントも含むsetTimeout
- ネストを避けるつもりが then の連鎖で複雑になることも:小分け関数で整理すべき
- 非同期関数の戻り値は常にPromise:
は暗黙でPromiseを返すasync function
- Promiseの中で同期的にエラーを投げると外に伝播しない:
やreject()
の活用を忘れずにtry/catch
Promiseを“適切に設計”できるかどうかで非同期の品質が変わります。
まとめ
Promiseは、非同期処理の成功/失敗とその結果を、わかりやすく・安全に扱うための仕組みです。
コールバックのネストを回避し、コードを構造的に記述することで、非同期処理の保守性と予測可能性が飛躍的に向上します。
async/await に進む前に、Promiseの仕組みと役割をしっかり理解することが、非同期設計の第一歩となります。