news 2026/8/22 15:02:14

until-async快速上手教程:5分钟写出第一个无try/catch的Promise错误处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
until-async快速上手教程:5分钟写出第一个无try/catch的Promise错误处理

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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 14:54:32

MobilityDB上云部署指南:AWS、Azure、GCP三大云平台迁移全解析

MobilityDB上云部署指南&#xff1a;AWS、Azure、GCP三大云平台迁移全解析 【免费下载链接】MobilityDB MobilityDB is a geospatial trajectory data management & analysis platform, built on PostgreSQL and PostGIS. 项目地址: https://gitcode.com/gh_mirrors/mo/M…

作者头像 李华
网站建设 2026/8/22 14:53:21

CityPicker城市选择器:快速搭建Android省市区地址选择组件

CityPicker城市选择器&#xff1a;快速搭建Android省市区地址选择组件 【免费下载链接】citypicker citypicker城市选择器&#xff0c;详细的省市区地址信息&#xff0c;支持仿iOS滚轮实现&#xff0c;仿京东样式&#xff0c;一级或者三级列表展示方式。 项目地址: https://g…

作者头像 李华