0Pricing
JavaScript Academy · レッスン

E3 — Promiseプール/キュー(非同期コンカレンシー)

小さな同時実行数の上限を設けて、多数の非同期タスクを実行します。キューを管理し、少数ずつ開始して、結果を収集します。

「E3 — Promiseプール/キュー(非同期コンカレンシー)」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。

何を、なぜ作るのか

目標: システムに負荷を集中させず、多数の非同期ジョブを実行します。

  • 同時実行数を制限します(例: 一度に2件)
  • シンプルなキューのインデックスを保持します
  • 結果を配列に保存します
  • 初心者にも分かりやすい小さなヘルパーで実装します
E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト1

非同期ジョブヘルパー

小さなヘルパーは、遅延後に解決するPromiseを返します。テスト用に、必要に応じて失敗させることもできます。

// Simulate async work with setTimeout
function fakeJob(name, ms, fail) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      if (fail) {
        reject(new Error("fail:" + name));
      } else {
        resolve("done:" + name);
      }
    }, ms);
  });
}

console.log("demo job:", typeof fakeJob === "function");
E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト2

プールの実装

runPoolはいくつかのワーカーを起動します。各ワーカーは次のタスクインデックスを取得してawaitし、結果は入力順を維持します。

// Run tasks with a fixed concurrency limit
async function runPool(tasks, limit) {
  // tasks: array of functions () => Promise<any>
  const results = new Array(tasks.length);
  let next = 0;

  // worker runs tasks until none left
  async function worker() {
    while (true) {
      const i = next;
      if (i >= tasks.length) return;
      next = next + 1;

      try {
        const value = await tasks[i]();
        results[i] = { ok: true, value: value };
      } catch (e) {
        results[i] = { ok: false, error: String(e) };
      }
    }
  }

  // start up to limit workers
  const workers = [];
  for (let k = 0; k < limit; k = k + 1) {
    workers.push(worker());
  }

  await Promise.all(workers);
  return results;
}

console.log("pool ready:", typeof runPool === "function");
E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト3

プールを実行する

実行中のジョブを2件に制限します。配列は順序を維持するため、インデックスiにはタスクiの結果が入ります。

// Prepare simple tasks
const jobs = [
  function () { return fakeJob("A", 300, false); },
  function () { return fakeJob("B", 200, false); },
  function () { return fakeJob("C", 150, true ); },
  function () { return fakeJob("D", 100, false); }
];

// Run with concurrency = 2
(async function () {
  const out = await runPool(jobs, 2);
  console.log("results:", out);
})();
E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト4

任意の再試行ラッパー

小さなwithRetryヘルパーでタスクをラップします。回数は小さく保ち、ロジックもシンプルにします。

// Optional: add retry to a task wrapper (beginner-friendly)
function withRetry(task, attempts) {
  return async function () {
    let lastErr = null;
    for (let i = 0; i < attempts; i = i + 1) {
      try {
        return await task();
      } catch (e) {
        lastErr = e;
      }
    }
    throw lastErr;
  };
}

const jobsWithRetry = [
  withRetry(function () { return fakeJob("R1", 80, true); }, 2),
  withRetry(function () { return fakeJob("R2", 60, false); }, 2)
];

(async function () {
  const out = await runPool(jobsWithRetry, 1);
  console.log("retry results:", out);
})();
E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト5

初心者向けガイダンス

ヒント:

  • タスクは () => Promise 関数として保存します。
  • キュー用の共有 next index を保持します。
  • タスクごとに try/catch を使い、結果を保存します。
  • 初心者向けには小さな上限(2~4)を設定します。
E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト6

同時実行数制限の基礎クイズ

簡単な確認:なぜプールを使うのでしょうか?

E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト7

まとめ

まとめ:小さな promise pool は固定の上限でタスクを実行し、結果配列内の順序を維持し、各タスクでシンプルな try/catch を使用します。初心者に最適なパターンです。

E3 — Promiseプール/キュー(非同期コンカレンシー) — イラスト8

よくある質問

「E3 — Promiseプール/キュー(非同期コンカレンシー)」レッスンは無料ですか?

はい。「E3 — Promiseプール/キュー(非同期コンカレンシー)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。

「E3 — Promiseプール/キュー(非同期コンカレンシー)」で何を学びますか?

小さな同時実行数の上限を設けて、多数の非同期タスクを実行します。キューを管理し、少数ずつ開始して、結果を収集します。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「E3 — Promiseプール/キュー(非同期コンカレンシー)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. E1 — 式評価器(パート1:+と-の左から右への処理)
  2. E2 — ログアナライザー(簡単なフィルターとカウンター)
  3. E3 — Promiseプール/キュー(非同期コンカレンシー)
← JavaScript Academyに戻る