0Pricing
JavaScript Academy · 课时

E3——Promise 池/队列(异步并发)

使用小型并发限制运行多个异步任务。维护一个队列,每次启动几个任务,并收集结果

E3——Promise 池/队列(异步并发) 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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会启动几个 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");
E3——Promise 池/队列(异步并发) — 插图 3

运行任务池

将正在执行的任务限制为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);
})();
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 池会在固定限制下运行任务,将顺序保存在结果数组中,并为每个任务使用简单的 try/catch。这是非常适合初学者的模式。

E3——Promise 池/队列(异步并发) — 插图 8

常见问题解答

「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 反馈 — 无需本地设置。

此课程中的所有课时

  1. E1——表达式求值器(第 1 部分:+ 和 -,从左到右)
  2. E2——日志分析器(简单筛选与计数器)
  3. E3——Promise 池/队列(异步并发)
← 返回 JavaScript Academy