5个until-async常见坑点:为什么不能直接传Promise实例?

发布时间:2026/8/22 15:41:40
5个until-async常见坑点:为什么不能直接传Promise实例? 5个until-async常见坑点为什么不能直接传Promise实例【免费下载链接】until-asyncGracefully handle Promises using async/await without try/catch.项目地址: https://gitcode.com/gh_mirrors/un/until-asyncuntil-async 是一个轻量级 JavaScript 工具库让你用async/await优雅地处理 Promise无需再写繁琐的try/catch。它把错误和数据打包成[error, data]元组返回风格与 Node.js 回调 API 一脉相承。但许多新手在使用时会踩进 5 个常见坑点其中最核心的一个就是为什么不能直接传一个 Promise 实例本文将逐一拆解帮你快速上手。坑点 1给 until 直接传 Promise 实例 ⚠️这是新手最常遇到的疑问。很多人会这样写import { until } from until-async // ❌ 错误示范直接传 Promise const [error, data] await until(fetchUser(id))而until的签名见 src/index.ts明确要求传入一个返回 Promise 的函数// ✅ 正确写法传一个函数 const [error, data] await until(() fetchUser(id))原因有两点捕获时机问题Promise 实例在传入until之前就已经被创建。如果fetchUser(id)在返回 Promise 之前就同步抛错比如参数校验失败这个错误发生在until的保护范围之外根本捕获不到。传函数则把整个调用过程都包进 try/catch。处理逻辑单元而非单个 Promise这是作者的刻意设计README 的 FAQ 有详细说明。一个until调用可以包裹一段复杂的异步逻辑其中任意一步出错都能被同一个error捕获const [error, data] await until(async () { const user await fetchUser() const nextUser normalizeUser(user) const transaction await saveModel(user, user) return transaction.result })如果只接受 Promise 实例这种一次调用管一整段逻辑的能力就完全无从实现。坑点 2忘记先判断 error 就直接用 datauntil不会帮你抛错它只是把结果打包返回。如果你跳过判断直接使用数据const [error, data] await until(() fetchUser(id)) // ❌ error 存在时 data 是 null这里会直接崩 return data.name最快避错方法始终先写if (error)分支形成肌肉记忆。元组保证了两者的互斥关系——要么有错误要么有数据。坑点 3TypeScript 自定义错误忘了显式标注类型until的泛型默认把错误类型推断为Error见 src/until.test-d.ts 中的类型测试。如果你的接口 reject 的是自定义错误对象比如{ type: NOT_FOUND }不做显式标注的话error.type在 TS 里会报错// ✅ 显式声明错误类型和数据类型 const [error, data] await untilUserFetchError, User(() fetchUser(id))而一旦标注了类型TypeScript 会把它当作可辨识联合类型处理if (error)分支里data自动收窄为nullelse 分支里error收窄为null体验非常顺滑。坑点 4把 data 当成一定存在的变量很多来自回调式写法的开发者会下意识地给data设初始值或加兜底// ❌ 多余的防御代码 const data (result[1] ?? {}).nameuntil返回的元组类型UntilResult定义在 src/index.ts已经用类型系统强制表达了错误与数据互斥。正确姿势是信任类型写清晰的两分支逻辑即可兜底代码反而会掩盖真实问题。坑点 5记反元组顺序——是 [error, data]不是 [data, error]until遵循 Node.js 回调的约定错误永远排第一const [error, data] await until(() Promise.resolve(123)) // error null, data 123顺手记法看到until就联想 until 出错为止所以 error 在前。写反了解构顺序不会报错但会导致静默的 null 数据事故是最隐蔽的坑。快速安装与验证通过 npm 安装即可使用npm install until-async如果你克隆了源码仓库可以运行pnpm test查看 src/until.test.ts 中的行为测试正常值、reject 错误、自定义 reject 值都被覆盖类型层面的保证则写在 src/until.test-d.ts 中。项目构建与发布配置分别位于 tsdown.config.ts 和 package.json。小结坑点一句话记忆传 Promise 实例只传函数让 try/catch 包住整个逻辑单元不判断 error永远if (error)先行自定义错误显式泛型untilMyError, Data兜底 data信任元组类型写两分支元组顺序错误在前[error, data]掌握这 5 个要点until-async 就能成为你项目中替代 try/catch 的优雅选择。【免费下载链接】until-asyncGracefully handle Promises using async/await without try/catch.项目地址: https://gitcode.com/gh_mirrors/un/until-async创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考