Promise.allと並列処理
Promise.allと並列処理 とは
複数の非同期処理を並列実行し、すべての結果を取得する方法を学ぼう。本レッスンでは、Promise.allと並列処理 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
Promise.allと並列処理
複数の非同期処理を効率的に実行する方法を学びましょう。
Promise.all
全てのPromiseが成功したら結果の配列を返します。
JavaScript
const [users, posts, comments] = await Promise.all([
fetchUsers(),
fetchPosts(),
fetchComments()
]);Promise.allSettled
成功・失敗に関わらず全ての結果を取得します。
JavaScript
const results = await Promise.allSettled([p1, p2, p3]);
// [{ status: "fulfilled", value: ... }, { status: "rejected", reason: ... }]バッチ処理
大量のリクエストを一度に送ると負荷がかかるため、バッチに分割します。
この問題では、Promise.allの並列処理パターンを同期的に練習します。配列をバッチに分割する関数を実装しましょう。
よくある質問
Q. Promise と async/await はどっちを使うべき?
A. 新規コードは async/await が圧倒的に読みやすいため第一選択です。Promise.all などで並列実行したいときは Promise メソッドを併用します。最終的に内部では同じ Promise オブジェクトが動いているので、混在しても問題ありません。
Q. rejected の Promise をハンドルしないとどうなりますか?
A. Node.js では UnhandledPromiseRejection の警告が出て、最悪プロセスが落ちます。必ず .catch() を付けるか async 関数内で try/catch で囲んでください。グローバルに process.on('unhandledRejection') で観測する仕組みも入れておくと安心です。
Q. Promise.all と Promise.allSettled の違いは?
A. all は 1 つでも reject すると全体が reject されます。allSettled は全 Promise の結果を {status, value/reason} の配列で返し、失敗があっても他の成功結果は取れます。「全部成功して欲しい」なら all、「個別に結果を集計したい」なら allSettled です。
次のレッスン
次は HTTPとREST API で、複数の非同期処理を並列実行し、すべての結果を取得する方法を学ぼう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- Promise.allと並列処理 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. Promise.allと並列処理 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
入出力例
test-cases.txt
batchProcess([1,2,3,4,5], 2) → {"batchSize":2,"batches":[{"batchIndex":0,"count":2,"items":[1,2]},{"batchIndex":1,"count":2,"items":[3,4]},{"batchIndex":2,"count":1,"items":[5]}],"totalBatches":3,"totalItems":5}
batchProcess(["a","b","c"], 5) → {"batchSize":5,"batches":[{"batchIndex":0,"count":3,"items":["a","b","c"]}],"totalBatches":1,"totalItems":3}
batchProcess([], 3) → {"batchSize":3,"batches":[],"totalBatches":0,"totalItems":0}