E3——Promise 池/队列(异步并发)
使用小型并发限制运行多个异步任务。维护一个队列,每次启动几个任务,并收集结果
E3——Promise 池/队列(异步并发) 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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会启动几个 workers;每个 worker 获取下一个任务索引并等待任务完成。结果保持输入顺序。
// 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的 result。
// 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 池会在固定限制下运行任务,将顺序保存在结果数组中,并为每个任务使用简单的 try/catch。这是非常适合初学者的模式。

常见问题解答
「E3——Promise 池/队列(异步并发)」课时是免费的吗?
是的 — 「E3——Promise 池/队列(异步并发)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。
「E3——Promise 池/队列(异步并发)」这节课中我会学到什么?
使用小型并发限制运行多个异步任务。维护一个队列,每次启动几个任务,并收集结果 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。
「E3——Promise 池/队列(异步并发)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- E1——表达式求值器(第 1 部分:+ 和 -,从左到右)
- E2——日志分析器(简单筛选与计数器)
- E3——Promise 池/队列(异步并发)