Promise.allと並列処理

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

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 つができることを確認しましょう。

  1. Promise.allと並列処理 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (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}
main.js
main.js
学習モード

メモ

Promise.allと並列処理

⌘S で保存