では「Promise.allSettled + finally のタイムライン形式フロー図」を作って、
各 Promise がいつ完了して、finally がどう動くかを視覚化します。
タイムライン形式フロー図
シナリオ
3つの API を同時に呼ぶ:
fetchUser()→ 成功fetchPosts()→ 失敗fetchComments()→ 成功
Promise.allSettled + finally で安全に処理する
Time →
┌────────────────────────────────────────┐
| showLoadingSpinner() │ ← ローディング表示ON |
└────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────┐
| Promise.allSettled開始(並列で実行) |
| fetchUser, fetchPosts, fetchComments |
└────────────────────────────────────────┘
│
▼
┌───────┐ ┌────────┐ ┌─────────┐
| fetchUser | | fetchPosts | | fetchComments |
| 成功 | | 失敗 | | 成功 |
└───────┘ └────────┘ └─────────┘
│ │ │
▼ ▼ ▼
結果取得→fulfilled 結果取得→rejected 結果取得→fulfilled
│ │ │
└───────結果配列にまとめ────────┘
(results)
│
▼
┌─────────────────────────────┐
| 結果チェック・部分成功処理 |
| user → results[0].value |
| posts → null (failed) |
| comments → results[2].value |
└─────────────────────────────┘
│
▼
┌─────────────────────────────┐
| finally ブロック実行 |
| hideLoadingSpinner() |
| ローディング解除 & 後処理 |
└─────────────────────────────┘
│
▼
┌─────────────────────────────┐
| 全部完了 → データ利用可 |
└─────────────────────────────┘

コード対応
async function loadAllDataSafe() {
showLoadingSpinner(); // タイムライン最初
try {
const results = await Promise.allSettled([
fetch("/api/user").then(r => r.json()), // 成功
fetch("/api/posts").then(r => r.json()), // 失敗
fetch("/api/comments").then(r => r.json()) // 成功
]);
const user = results[0].status === "fulfilled" ? results[0].value : null;
const posts = results[1].status === "fulfilled" ? results[1].value : [];
const comments = results[2].status === "fulfilled" ? results[2].value : [];
console.log("部分成功結果:", { user, posts, comments });
} finally {
hideLoadingSpinner(); // 最後に必ず実行
console.log("UI後処理完了");
}
}
JavaScriptポイント
Promise.allSettledは 並列処理完了を待つ → 成功・失敗混在可results配列で各 Promise の状態を確認できる- finally は 成否に関係なく最後に必ず実行される → UI片付けやリソース解放に最適
- 部分失敗でも安全に処理できる → 失敗分にはデフォルト値を代入
💡 このタイムライン図で理解すると:
- どの Promise がいつ完了したか
- 成功/失敗の判定
- finally が必ず最後に動くこと
が直感的にわかります。


