0Pricing
TypeScript Academy · 课时

并发模式(all/settled/race)的类型

使用 Promise.all / allSettled / race 建模并发,理解它们的结果类型,并构建安全的辅助函数。

并发模式(all/settled/race)的类型 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 3 节课。

简介

目标:使用 Promise.all 并发运行任务,使用 allSettled 处理混合结果,并使用 race 实现超时/备用方案。了解它们各自返回的类型。

all:元组类型

使用元组调用 Promise.all 时,会保留元素类型和顺序;每个元素都会等待并转换为其内部类型。

async function one(): Promise<number> { return 1 }
async function two(): Promise<string> { return "two" }

async function runAll() {
  const [a, b] = await Promise.all([one(), two()]);
  // a: number, b: string
  console.log(a + 1, b.toUpperCase());
}

runAll();

all:并发映射

先启动多个任务,然后使用 await 一起等待它们。这里 Promise.all 会得到 string[]。

async function fetchItem(id: number): Promise<string> {
  return `item-${id}`;
}

async function getMany(ids: number[]): Promise<string[]> {
  const tasks = ids.map(id => fetchItem(id)); // start all
  return Promise.all(tasks); // await all
}

getMany([1,2,3]).then(xs => console.log(xs));

allSettled 类型

allSettled 永远不会拒绝;它会解析为一个数组,其中包含已完成或已拒绝的结果对象,您可以根据 status 对其进行收窄。

async function mightFail(n: number): Promise<number> {
  if (n % 2 === 0) return n; else throw new Error("odd")
}

async function runSettled() {
  const results = await Promise.allSettled([mightFail(1), mightFail(2)]);
  for (const r of results) {
    if (r.status === "fulfilled") {
      // r: PromiseFulfilledResult<number>
      console.log("ok", r.value);
    } else {
      // r: PromiseRejectedResult
      console.warn("fail", r.reason);
    }
  }
}

runSettled();

race 与超时

race 会以最先完成的 Promise 的结果进行解析或拒绝。将它与超时结合,可以限制延迟。

function timeout<T>(ms: number, msg = "Timeout"): Promise<T> {
  return new Promise((_, reject) => setTimeout(() => reject(new Error(msg)), ms));
}

async function slow(): Promise<string> { return new Promise(res => setTimeout(() => res("done"), 100)); }

async function withTimeout() {
  const result = await Promise.race<Promise<string>>([
    slow(),
    timeout<string>(50, "Too slow"),
  ]);
  console.log(result);
}

withTimeout().catch(e => console.error("raced:", e.message));

提示与选择

提示:

  • all:快速失败地汇总结果。
  • allSettled:收集成功结果和错误,而不会抛出异常。
  • race:用于超时/备用方案;请明确元素类型。

Promise.all 类型检查

快速检查:关于 Promise.all 类型的哪项说法是 TRUE?

回顾

回顾:使用 all 实现带类型的并行处理,使用 allSettled 检查所有结果,并使用 race 处理超时——请了解每个 API 返回的结构。

常见问题解答

「并发模式(all/settled/race)的类型」课时是免费的吗?

是的 — 「并发模式(all/settled/race)的类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 3 节课。

「并发模式(all/settled/race)的类型」这节课中我会学到什么?

使用 Promise.all / allSettled / race 建模并发,理解它们的结果类型,并构建安全的辅助函数。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。

「并发模式(all/settled/race)的类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Promise 与 async/await 类型
  2. 错误类型(unknown)与 catch 中的收窄
  3. 并发模式(all/settled/race)的类型
← 返回 TypeScript Academy