Topiqlo ロゴ

Promise

公開日: 2025/06/02

Promiseとは?──JavaScriptの非同期処理をシンプルに制御する仕組み

はじめに

JavaScript で API を呼び出したり、ファイルを読み込んだりする処理を書いていると、次の処理を“いつ”“どうやって”実行するかが問題になります。
かつては「コールバック地獄(callback hell)」がその代表例でした。
それを救ったのが Promise(プロミス) という仕組みです。
本記事では、Promise の基本概念、使い方、設計メリット、

async/await
との関係までを解説します。

基本情報・概要

Promise は、非同期処理の最終的な完了(成功)または失敗(エラー)を表すオブジェクトです。
状態と結果を管理しながら、処理の順序制御を可能にするAPIです。

主な特徴:

  • 非同期処理の成功/失敗を明確に扱える
  • .then()
    /
    .catch()
    /
    .finally()
    で流れるような制御が可能
  • コールバックよりもネストが浅く、可読性が高い

Promise は「非同期処理の結果を“未来の値”として扱うオブジェクト」です。

比較・分類・特徴の表形式まとめ(任意)

比較対象特徴問題点/特徴
コールバック関数を引数に渡すネストが深くなりがち、エラー処理が難しい
Promisethen/catchで処理フローを構造化可読性が高く、エラーも捕捉しやすい
async/awaitPromiseをより直感的に使える構文内部的には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
    async function
    は暗黙でPromiseを返す
  • Promiseの中で同期的にエラーを投げると外に伝播しない
    reject()
    try/catch
    の活用を忘れずに

Promiseを“適切に設計”できるかどうかで非同期の品質が変わります。

まとめ

Promiseは、非同期処理の成功/失敗とその結果を、わかりやすく・安全に扱うための仕組みです。
コールバックのネストを回避し、コードを構造的に記述することで、非同期処理の保守性と予測可能性が飛躍的に向上します。
async/await に進む前に、Promiseの仕組みと役割をしっかり理解することが、非同期設計の第一歩となります。