クイックリファレンス

JavaScript Promise チートシート

JavaScript Promise の包括的リファレンス:コンストラクタ、チェーン接続、エラーハンドリング、結合メソッド (all, allSettled, race, any)、async/await。

· 公開日

Promise は、非同期処理の最終的な完了(または失敗)と、その結果得られる値を表すオブジェクトです。

Promise の状態遷移

Promise は常に以下の3つの排他的な状態のいずれかをとります:

  1. pending (待機): 初期状態。成功も失敗もしていない処理中の状態。
  2. fulfilled (履行): 処理が正常に完了した状態 (resolve(value)).
  3. rejected (拒絶): 処理がエラーで失敗した状態 (reject(error)).

コンストラクタと基本的なメソッドチェーン

const loadUser = (id) => {
  return new Promise((resolve, reject) => {
    fetch(`/api/users/${id}`)
      .then((res) => {
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return res.json();
      })
      .then((data) => resolve(data))
      .catch((err) => reject(err));
  });
};

loadUser(42)
  .then((user) => console.log('取得完了:', user.name))
  .catch((err) => console.error('Error:', err.message))
  .finally(() => console.log('リクエスト処理完了'));

静的リゾルバメソッド

// 即座に解決される Promise
const p1 = Promise.resolve('Immediate value');

// 即座に拒絶される Promise
const p2 = Promise.reject(new Error('Immediate failure'));

Promise 結合メソッド (Combinators)

メソッド 動作仕様 失敗条件
Promise.all([p1, p2]) 配列内のすべての Promise が成功するのを待機 いずれか1つでも失敗した場合 (即座にショートサーキット)
Promise.allSettled([p1, p2]) すべての Promise の成否が決まるまで待機 (決して拒絶されない) 決して拒絶されない
Promise.race([p1, p2]) 最初に完了 (成功・失敗問わず) した Promise の結果を採用 最初に完了した Promise が失敗した場合
Promise.any([p1, p2]) 最初に成功した Promise の結果で解決 すべての Promise が失敗した場合 (AggregateError)
// Promise.all: 独立した複数の非同期処理を並行待機
const [users, posts] = await Promise.all([
  fetchUsers(),
  fetchPosts()
]);

// Promise.allSettled: すべての非同期結果の成否を安全に検査
const results = await Promise.allSettled([reqA(), reqB()]);
results.forEach((res) => {
  if (res.status === 'fulfilled') console.log('Value:', res.value);
  else console.error('Reason:', res.reason);
});

Async / Await による等価な記述

async function getUserData(id) {
  try {
    const res = await fetch(`/api/users/${id}`);
    const data = await res.json();
    return data;
  } catch (err) {
    console.error('Failed to retrieve user:', err);
    throw err;
  }
}

関連リファレンス

関連テーマ