JS

Promise

初級

読み方:プロミス|英語:Promise

非同期処理の結果を表すオブジェクトで、「後で結果を返すよ」という約束だよ。

やさしい説明

Promise(プロミス)とは、非同期処理の結果を表すオブジェクトです。「約束」という意味で、「処理が完了したら結果を返すよ」という約束を表します。

ネット通販に例えると、注文した瞬間に「配送中」(pending)→ 届いたら「完了」(fulfilled)、届かなかったら「失敗」(rejected)です。

成功時は .then()、失敗時は .catch() で処理を書きます。async/await を使うとさらに読みやすく書けます。

図解:Promiseの3つの状態

Promise: pending→fulfilled(.then)またはrejected(.catch)

具体例・使い方

// APIからデータを取得(.then チェーン)
fetch("https://api.example.com/users")
  .then(res => res.json())          // 成功: JSONに変換
  .then(data => console.log(data))  // データを使う
  .catch(err => console.error("失敗:", err))
  .finally(() => console.log("完了")); // 成否に関わらず実行

// async/awaitで書くと読みやすい(同じ処理)
async function getUsers() {
  try {
    const res = await fetch("https://api.example.com/users");
    const data = await res.json();
    return data;
  } catch (err) {
    console.error("失敗:", err);
  }
}

Promise.all と Promise.allSettled

// Promise.all: 全部成功したら結果を配列で返す
// 1つでも失敗するとcatchに移る
const [user, posts] = await Promise.all([
  fetchUser(1),
  fetchPosts(1),
]);

// Promise.allSettled: 成否に関わらず全結果を返す
const results = await Promise.allSettled([
  fetchUser(1),
  fetchPosts(1),
]);
results.forEach(r => {
  if (r.status === "fulfilled") console.log(r.value);
  else console.error(r.reason);
});

独立した複数のAPI呼び出しは Promise.all() で並列実行すると速くなります。どれか1つが失敗しても他の結果を使いたい場合は Promise.allSettled() を選びましょう。

いつ使う?

  • API通信(fetch は Promise を返す)
  • ファイルの読み書き(Node.js の fs モジュール)
  • 複数の非同期処理を並列実行するとき(Promise.all
  • 自分で非同期処理を定義するとき(new Promise(...)

間違いやすいポイント

❌ .catch() を書き忘れてエラーが握りつぶされる

Promise のエラーは .catch()try-catch で必ず処理しましょう。書き忘れると「Unhandled Promise Rejection」の警告が出てバグの原因になります。

❌ .then() の戻り値を return し忘れる

.then() の中で別の Promise を返す場合、return を忘れると次の .then()undefined を受け取ります。チェーンを繋ぐときは必ず return しましょう。

よくある疑問

Q: async/awaitとthen/catchの違いは?

A: 同じPromiseを扱いますが、async/awaitの方が同期的な見た目で読みやすいコードになります。どちらを使ってもOKです。

Q: Promiseの3つの状態とは?

A: pending(処理中)、fulfilled(成功)、rejected(失敗)の3つです。一度fulfilledかrejectedになると変わりません。

Q: Promise.allとは?

A: 複数のPromiseを並列実行し、全て完了するのを待ちます。1つでも失敗すると全体が失敗になります。全結果が欲しいならPromise.allSettledを使います。

関連用語

  • async/await — Promiseをより読みやすく書くための構文
  • コールバック — Promiseが登場する前の非同期処理の書き方
  • API — fetchなどAPIアクセスではPromiseが必ず登場する
  • try-catch — async/await と組み合わせてPromiseのエラーを処理する

📖 関連レッスン

レッスンを見る →

関連ブログ記事

⚠️ 関連するエラー

❓ 関連するQ&A