until-async快速上手教程:5分钟写出第一个无try/catch的Promise错误处理
【免费下载链接】until-asyncGracefully handle Promises using async/await without try/catch.项目地址: https://gitcode.com/gh_mirrors/un/until-async
until-async 是一个零依赖的 TypeScript 工具库,让你用 async/await 优雅地处理 Promise:一个 until 函数返回 [error, data] 元组,从此告别繁琐的 try/catch 错误处理。本文带你 5 分钟写出第一个无 try/catch 的 Promise 错误处理。
🤔 为什么需要无 try/catch 的 Promise 错误处理?
async/await 让异步代码写得像同步代码,但 await 本身并不提供错误处理机制:一旦 Promise 被拒绝,整个函数作用域就会中断。于是我们只能给每个 await 套上 try/catch:
async function getUser(id) { let data = null try { data = await fetchUser(id) } catch (error) { console.error(error) } return data }await 越多,try/catch 嵌套越深,还容易遗漏。until-async 的思路更简单:把"成功"和"失败"都变成返回值,用 error 参数判断结果,而不是靠异常中断流程。
📦 快速安装:一条命令接入 until-async
npm install until-async纯 ESM、零运行时依赖、原生 TypeScript 类型支持,Node.js 前端与后端项目均可直接使用。
🚀 5 分钟上手:写出第一个 until 调用
import { until } from 'until-async' const [error, data] = await until(() => fetchUser(id)) if (error) { return handleError(error) } return data规则一句话:成功得到 [null, 数据],失败得到 [错误, null]。你只需要判断一次 error。
✨ TypeScript 友好:自动推断 error 与 data 类型
不写泛型时,TypeScript 会根据回调返回值自动推断 data 的类型;需要更精确控制时,传入两个泛型参数——第一个是错误类型,第二个是数据类型:
const [error, data] = await until<UserFetchError, User>(() => fetchUser(id))返回类型是一个判别联合的元组:在 if (error) 分支里 TS 知道 data 是 null;出了 if 分支则知道 data 一定是 User。不需要 ! 非空断言,也不需要额外类型标注。
🔍 进阶技巧:把一整段异步逻辑交给 until
为什么 until 接收一个函数,而不是直接接收 Promise?因为它要的是"一个逻辑单元",而不是"一个 Promise"。你可以在回调里写多步 await、校验甚至断言,其中任何一步出错,都会统一从同一个 error 返回:
const [error, data] = await until(async () => { const user = await fetchUser() const result = await saveModel('user', normalizeUser(user)) if (result.status !== 'OK') throw new Error('Saving user failed') return result.data })一次 if (error) 就能覆盖整段流程的失败情况,代码保持扁平。
📂 项目结构速览
想进一步了解实现,可以看看这些文件:
- src/index.ts:核心实现,until 函数与 UntilResult 元组类型,不到 30 行
- src/until.test.ts:功能测试(成功与失败两条路径)
- src/until.test-d.ts:类型测试(自动推断与类型收窄)
- README.md:完整文档与更多示例
- package.json:包信息,当前 3.x 版本,MIT 协议
❓ 常见问题
until 和 try/catch 到底有什么区别?
本质相同,形态不同:try/catch 靠异常中断流程,until 把结果直接返回,代码更扁平、错误更不易遗漏。需要"出错立刻中断"的场景仍可用 try/catch,两者可以共存。
能捕获非 Error 类型的错误吗?
可以。拒绝值即使是字符串等自定义原因,也会被原样放进元组的第一个位置;配合 TypeScript 泛型还能明确声明错误类型。
适合哪些场景?
API 请求封装、批量任务、后台作业,以及任何"希望拿到错误而不是中断流程"的异步逻辑——它的 [error, data] 形态与 Node.js 回调约定非常接近,在 Node.js 服务中尤其顺手。
总结
until-async 用不到 30 行代码解决了一个高频痛点:一个 until 函数,让 Promise 错误处理告别 try/catch 嵌套。现在就可以安装它,在你的下一个 async/await 项目里试试 ✨
【免费下载链接】until-asyncGracefully handle Promises using async/await without try/catch.项目地址: https://gitcode.com/gh_mirrors/un/until-async
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考