JavaScriptのPromise.allとallSettledの違い|失敗時の動きを初心者向けに解説

#JavaScript#Promise#非同期処理#初心者#Web開発
MAO先生と生徒うみちゃん、生徒りくちゃんが教室でJavaScriptのPromise.allとPromise.allSettledを学ぶイラスト
MAO先生と生徒たちを紹介

この記事でわかること

  • Promise.allPromise.allSettledの基本的な違い
  • 1つでも失敗したら止めたい処理でPromise.allを選ぶ理由
  • 成功と失敗を全部集めたい処理でPromise.allSettledを選ぶ理由
  • statusfulfilledrejectedvaluereasonの読み方
  • Node.jsやブラウザで試せる完全なJavaScript例

結論・重要ポイント

  1. Promise.allは、すべて成功したときだけ結果配列を返し、1つでも失敗するとその時点で失敗扱いになります。
  2. Promise.allSettledは、すべての処理が成功または失敗のどちらかに決まるまで待ち、各結果を配列で返します。
  3. 全部そろわないと意味がない処理にはPromise.allが向いています。
  4. 一部失敗しても成功分を使いたい処理にはPromise.allSettledが向いています。
  5. allSettledの結果は、statusを見てvalueまたはreasonを分けて扱います。

対象読者と前提知識

この記事は、JavaScriptの非同期処理を学び始めて、複数の処理をまとめて待つ書き方で迷っている方向けです。

Promiseasyncawaitという言葉を見たことがあり、関数の結果を待ってから次の処理へ進む考え方が分かれば読み進められます。この記事では、外部APIへ通信せず、ダミーのPromiseだけで違いを確認します。

MAO先生と学ぶPromise.all・Promise.allSettled

生徒うみちゃん・疑問を感じている

生徒うみちゃん

複数のデータをまとめて取りたいときは、全部Promise.allで囲めばいいってこと?

MAO先生・説明中

MAO先生

結論から言うと、全部そろわないと次へ進めない処理ならPromise.allが合っています。理由は、1つでも失敗した時点で全体を失敗として扱えるからなのです。

生徒りくちゃん・興味深く聞いている

生徒りくちゃん

たとえば、ログインに必要なユーザー情報と権限情報のどちらかが取れない場合は、画面を進めない方がよいということですね!

MAO先生・笑顔

MAO先生

その理解で合っています。よく気づきましたね!片方だけ成功しても安全に画面を作れないなら、Promise.allでまとめて失敗させる方が扱いやすいです。

生徒うみちゃん・自信のある表情

生徒うみちゃん

でも、1個失敗しただけで全部ダメになるのはもったいないじゃん!成功した分だけ使えばいいじゃん!

MAO先生・説明中

MAO先生

その発想が必要な場面では、Promise.allSettledを使います。すべての処理が終わるまで待って、成功はfulfilled、失敗はrejectedとして結果を並べてくれるのです。

生徒りくちゃん・疑問を感じている

生徒りくちゃん

allSettledなら失敗しても例外にならない、という理解でよいのでしょうか?失敗を見落としてしまうことはないのですか?

MAO先生・注意している

MAO先生

大切な確認です。allSettledは失敗を消す仕組みではありません。statusrejectedの結果を見て、reasonをログに残す、再試行する、画面に注意を出すなどの処理が必要になります。

生徒うみちゃん・興味深く聞いている

生徒うみちゃん

つまり、止めたいならall、最後まで見たいならallSettledってこと?

MAO先生・笑顔

MAO先生

はい、まずはその選び方で十分です。例外として、失敗してもよい処理をPromise.allで扱いたい場合は、個別にcatchして成功扱いの値へ変換する方法もあります。

生徒りくちゃん・自信のある表情

生徒りくちゃん

処理同士が依存しているか、独立しているかを先に考えるということですね!

生徒うみちゃん・喜んでいる

生徒うみちゃん

名前だけ見ると似てるけど、失敗したときの作戦が違うんだ。そこを決めれば迷わないじゃん!

コード・操作手順・具体例

ここでは、3つの非同期処理のうち1つだけ失敗する例で比べます。外部通信は行わず、すぐ結果が分かるPromise.resolvePromise.rejectを使います。

1. そのまま試せるJavaScript

次のコードは、Node.jsまたはブラウザの開発者ツールで実行できる完全な例です。

const tasks = [
  Promise.resolve("顧客データ"),
  Promise.reject(new Error("在庫APIエラー")),
  Promise.resolve("おすすめ商品"),
];

try {
  const allResult = await Promise.all(tasks);
  console.log("Promise.all:", allResult);
} catch (error) {
  console.log("Promise.all error:", error.message);
}

const settledResult = await Promise.allSettled(tasks);

const summary = settledResult.map((result) => {
  if (result.status === "fulfilled") {
    return {
      status: result.status,
      value: result.value,
    };
  }

  return {
    status: result.status,
    reason: result.reason.message,
  };
});

console.log("Promise.allSettled:", JSON.stringify(summary, null, 2));

2. Node.jsで実行するコマンド

ファイルへ保存して試す場合は、たとえばpromise-demo.mjsという名前にします。

node promise-demo.mjs

3. 出力例

Promise.allは、在庫APIエラーの時点でcatchへ移動します。一方、Promise.allSettledは3件すべての結果を配列で返します。

Promise.all error: 在庫APIエラー
Promise.allSettled: [
  {
    "status": "fulfilled",
    "value": "顧客データ"
  },
  {
    "status": "rejected",
    "reason": "在庫APIエラー"
  },
  {
    "status": "fulfilled",
    "value": "おすすめ商品"
  }
]

4. どちらを選ぶかの目安

状況選びやすい方法理由
全データがそろわないと画面を作れないPromise.all1つの失敗で全体を止められる
複数サービスの稼働確認を一覧にしたいPromise.allSettled成功と失敗を全部表示できる
画像をまとめて取得し、失敗分だけ代替表示したいPromise.allSettled成功分を使い、失敗分を別処理できる
注文作成と決済確定のように両方必要Promise.all一部成功だけでは危険な状態になりやすい

5. allSettledの結果を成功と失敗に分ける

実務では、allSettledの結果をそのまま表示するより、成功分と失敗分に分けると扱いやすくなります。

const results = await Promise.allSettled(tasks);

const fulfilledValues = [];
const rejectedReasons = [];

for (const result of results) {
  if (result.status === "fulfilled") {
    fulfilledValues.push(result.value);
  } else {
    rejectedReasons.push(result.reason.message);
  }
}

console.log("成功:", fulfilledValues);
console.log("失敗:", rejectedReasons);

よくある誤解や失敗

Promise.allは失敗した処理以外を自動で取り消す

誤解です。Promise.allの返すPromiseは先に失敗扱いになりますが、すでに開始した処理そのものを自動で中断するとは限りません。通信を中断したい場合は、AbortControllerなど別の仕組みも検討します。

allSettledならエラー対応は不要

allSettledは失敗結果を配列へ入れて返します。失敗を無視してよいという意味ではありません。statusrejectedの結果を確認し、必要に応じてログ、再試行、ユーザー向け表示を行います。

どちらも結果の順番は完了順になる

結果配列の順番は、完了した順番ではなく、渡したPromiseの順番に対応します。遅く完了した処理があっても、配列の位置は入力順で考えます。

allSettledはPromise.allより常に安全

安全かどうかは目的次第です。決済、権限確認、在庫確保など、一部だけ成功した状態が危険な処理では、失敗時に全体を止める設計が必要です。

catchを書けば全部同じになる

個別のcatchで失敗を値へ変換すれば、Promise.allでも最後まで結果を集められます。ただし、意図が読み取りにくくなる場合があるため、最初から全結果を見たいならPromise.allSettledの方が分かりやすいことが多いです。

Q&A

Promise.allはどんなときに使うべきですか?

複数の処理が互いに依存していて、1つでも失敗したら全体を中止したいときです。ログイン初期化、注文確定、設定読み込みなど、全部そろって初めて意味がある処理で選びやすいです。

Promise.allSettledはどんなときに使うべきですか?

処理同士が独立していて、成功分だけでも使いたいときです。複数APIの状態確認、画像の一括読み込み、通知先ごとの送信結果集計などに向いています。

allSettledの結果にvalueがないことがありますか?

あります。statusfulfilledのときはvaluerejectedのときはreasonが入ります。先にstatusを確認してから読み取ると安全です。

Promise.allSettledは古いブラウザでも使えますか?

主要な現代ブラウザでは広く利用できますが、古い環境を対象にする場合は対応状況を確認してください。実務では対象ブラウザ、Node.jsのバージョン、ビルド設定を合わせて確認します。

要点まとめ

  • Promise.allは、全部成功したときだけ結果を返し、1つでも失敗すると全体が失敗する
  • Promise.allSettledは、すべての成功・失敗結果を配列で返す
  • 全部そろわないと危険な処理にはPromise.allを使う
  • 一部失敗しても成功分を使いたい処理にはPromise.allSettledを使う
  • allSettledではstatusを見て、valuereasonを分けて扱う

公式資料・参考資料

※公式仕様とMDN Web Docsを2026年6月25日に確認して作成しています。実務では、対象ブラウザやNode.jsのバージョンもあわせて確認してください。

JavaScriptやWeb業務ツールを相談できます

非同期処理は、画面表示、問い合わせフォーム、業務ツール、外部サービス連携などでつまずきやすい部分です。

MAO工房では、既存JavaScriptの整理、エラー処理の見直し、小規模なWeb業務ツールの設計・開発を支援しています。お問い合わせフォームから現在の困りごとをお知らせください。

授業に登場する3人については、MAO先生のIT授業 キャラクター紹介で確認できます。

MAO工房に相談できます

JavaScriptやWeb業務ツールの相談ができます

非同期処理で止まる、エラー原因が追いにくい、既存の業務ツールを改善したいなど、状況に合わせてコード整理や小規模開発を支援します。

  • ✓ 既存コードの整理
  • ✓ エラー処理の見直し
  • ✓ 小規模な業務ツールにも対応