E3 — Promiseプール/キュー(非同期コンカレンシー)
小さな同時実行数の上限を設けて、多数の非同期タスクを実行します。キューを管理し、少数ずつ開始して、結果を収集します。
「E3 — Promiseプール/キュー(非同期コンカレンシー)」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。
何を、なぜ作るのか
目標: システムに負荷を集中させず、多数の非同期ジョブを実行します。
- 同時実行数を制限します(例: 一度に2件)
- シンプルなキューのインデックスを保持します
- 結果を配列に保存します
- 初心者にも分かりやすい小さなヘルパーで実装します

非同期ジョブヘルパー
小さなヘルパーは、遅延後に解決する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");
プールの実装
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");
プールを実行する
実行中のジョブを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);
})();
任意の再試行ラッパー
小さな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);
})();
初心者向けガイダンス
ヒント:
- タスクは () => Promise 関数として保存します。
- キュー用の共有 next index を保持します。
- タスクごとに try/catch を使い、結果を保存します。
- 初心者向けには小さな上限(2~4)を設定します。

同時実行数制限の基礎クイズ
簡単な確認:なぜプールを使うのでしょうか?

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

よくある質問
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- E1 — 式評価器(パート1:+と-の左から右への処理)
- E2 — ログアナライザー(簡単なフィルターとカウンター)
- E3 — Promiseプール/キュー(非同期コンカレンシー)