异步 TypeScript 代码中的错误处理
使用带类型的包装器和工具管理异步错误
异步 TypeScript 代码中的错误处理 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
欢迎
异步函数会增加错误处理的复杂性。TypeScript 可确保您正确处理 Promise 拒绝。
异步 try-catch
将 await 调用放在 try-catch 中,以处理 Promise 拒绝。
async function loadUser(id: number): Promise<User> {
try {
return await api.getUser(id);
} catch (err: unknown) {
if (err instanceof Error) throw new AppError(err.message);
throw new AppError('Unknown error');
}
}Promise.all 错误
Promise.all 会因第一个拒绝而拒绝。请将其包装在 try-catch 中。
try {
const [user, posts] = await Promise.all([getUser(id), getPosts(id)]);
} catch (err) { /* one or both failed */ }Promise.allSettled
allSettled 会返回成功和失败的结果,而不会抛出错误。
const results = await Promise.allSettled([getUser(1), getPosts(1)]);
results.forEach(r => {
if (r.status === 'fulfilled') console.log(r.value);
else console.error(r.reason);
});带类型的异步结果
将异步操作与结果模式结合,以实现显式的错误处理。
async function safeGet<T>(fn: () => Promise<T>): Promise<Result<T>> {
try { return { ok: true, value: await fn() }; }
catch (e) { return { ok: false, error: e as Error }; }
}未处理的拒绝
在 Node.js 中监听未处理的拒绝,以防止程序崩溃。
process.on('unhandledRejection', (reason: unknown) => {
console.error('Unhandled rejection:', reason);
process.exit(1);
});使用 Promise.race 实现超时
使用 Promise.race 实现带类型的超时模式。
function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
const timeout = new Promise<never>((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), ms));
return Promise.race([promise, timeout]);
}重试模式
使用带类型的错误实现带类型的异步重试。
async function retry<T>(fn: () => Promise<T>, times: number): Promise<T> {
for (let i = 0; i < times; i++) {
try { return await fn(); } catch (e) { if (i === times - 1) throw e; }
}
throw new Error('Unreachable');
}并发错误处理
运行并发异步操作时处理错误。
const [userResult, postsResult] = await Promise.allSettled([
getUser(id).then(u => ({ ok: true, value: u })).catch(e => ({ ok: false, error: e })),
getPosts(id).then(p => ({ ok: true, value: p })).catch(e => ({ ok: false, error: e })),
]);AsyncQueue 错误传递
异步迭代器中的错误会通过 for-await 正确传递。
async function* generate() {
yield await fetchA();
yield await fetchB(); // error here stops the loop
}
for await (const item of generate()) { process(item); }Next.js 中带类型的错误中间件
在服务端操作中使用带类型的错误边界。
'use server';
async function createUser(data: CreateUserDto): Promise<Result<User>> {
return safeGet(() => db.user.create({ data }));
}快速检查
如果您没有在 async/await 函数中捕获被拒绝的 Promise,会发生什么?
回顾
异步 TypeScript 代码中的错误处理:您已经学习了本主题的关键概念,以及如何在实际 TypeScript 项目中应用它们。
常见问题解答
「异步 TypeScript 代码中的错误处理」课时是免费的吗?
是的 — 「异步 TypeScript 代码中的错误处理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「异步 TypeScript 代码中的错误处理」这节课中我会学到什么?
使用带类型的包装器和工具管理异步错误 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「异步 TypeScript 代码中的错误处理」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 带类型的错误类与层次结构
- Result 模式:Ok 与 Err
- 收窄捕获的错误:unknown 与 Error
- 异步 TypeScript 代码中的错误处理