尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

until-async新手教程:如何用[error, data]元组优雅处理async/await错误(完整指南)

until-async新手教程:如何用[error, data]元组优雅处理async/await错误(完整指南) until-async新手教程如何用[error, data]元组优雅处理async/await错误完整指南【免费下载链接】until-asyncGracefully handle Promises using async/await without try/catch.项目地址: https://gitcode.com/gh_mirrors/un/until-asyncuntil-async是一个轻量级 JavaScript 工具库教你如何用[error, data]元组优雅地处理async/await中的错误完全告别繁琐的try/catch包裹。本文面向新手5 分钟带你从零上手这个 Promise 错误处理神器。为什么需要 until-async——告别繁琐的 try/catchasync/await让异步代码读起来像同步代码但它有一个小痛点没有内置的错误处理 API。一旦某个await抛错整个函数作用域都会中断async function getUser(id) { const data await fetchUser(id) // 这里抛错后面代码全部执行不了 }标准做法是用try/catch包住每个awaitlet data null try { data await fetchUser(id) } catch (error) { console.error(error) }问题在于 每次异步操作都要重复包裹代码冗长 成功逻辑和错误逻辑被拆到不同分支闭包可读性变差 开发者经常忘记加try/catch埋下隐患until-async 的思路把try/catch封装进一个工具函数until让结果以 Node.js 风格的[error, data]元组返回——有错误时error有值、data为null成功时反之。一切都在同一个作用域内完成。5 分钟上手until-async 安装与第一个示例一键安装步骤在终端执行npm install until-async如需从仓库获取源码可执行git clone https://gitcode.com/gh_mirrors/un/until-async第一个示例最简用法import { until } from until-async async function getUserById(id) { const [error, data] await until(() fetchUser(id)) if (error) { return handleError(error) } return data }就一行核心代码const [error, data] await until(...)成功和失败的两种情况都被扁平化到了同一个作用域里。[error, data] 元组是怎么工作的until的返回值是一个二元组tuple规则非常直观场景errordataPromise 成功null解析出的值Promise 失败错误对象null比如await until(() Promise.resolve(123)) // [null, 123] await until(() Promise.reject(new Error(Oops!))) // [new Error(Oops!), null]这个设计在源码 src/index.ts 中只用了短短十几行就实现并定义了UntilResult类型来保证元组结构。为什么传函数而不是直接传 Promise这是新手最常问的问题官方 FAQ 见 README.md。答案是until接收一个函数让你把一整块逻辑视为一个单位函数内任何一步抛错都会被同一个error捕获const [error, data] await until(async () { const user await fetchUser() const normalized normalizeUser(user) const result await saveModel(user, normalized) return result }) if (error) { // 上面任何一步出错都会走到这里 }如果只能传单个 Promise你就得为每一步都套一层until反而更啰嗦。TypeScript 用户必看类型安全的错误处理until对 TypeScript 非常友好返回值被建模为可辨识联合类型discriminated unionimport { until } from until-async interface User { firstName: string age: number } interface UserFetchError { type: FORBIDDEN | NOT_FOUND message?: string } async function getUserById(id: string) { const [error, data] await untilUserFetchError, User(() fetchUser(id)) if (error) { // 这里 error 被推断为 UserFetchError可安全访问 error.type return handleError(error.type, error.message) } // 这里 data 被推断为 User return data.firstName }判断if (error)之后TypeScript 会自动收窄类型错误分支里data一定是null成功分支里error一定是null帮你把空值判断做得滴水不漏。相关的类型测试可以参见src/until.test-d.ts。项目文件速览代码在哪里这个项目结构极其精简非常适合初学者阅读源码src/index.ts—— 核心实现until函数与UntilResult类型定义src/until.test.ts—— 行为测试验证成功/失败两种元组结果src/until.test-d.ts—— 类型测试验证类型推断与联合类型收窄package.json—— 项目元信息当前版本 3.0.2采用 ESM 模块README.md—— 完整文档含 FAQ 与设计动机vitest.config.ts、tsdown.config.ts—— 测试与构建配置新手常见疑问清单Quntil-async 和 try/catch 有什么本质区别A语义等价但until不产生额外闭包成功/失败两条路径共享同一作用域代码更线性。Q它和 Go 语言的if err ! nil有什么相似之处A设计哲学完全一致——把错误作为返回值显式处理而不是靠异常中断控制流这也是它被称为 NodeJS-friendly 的原因。Q库的体积大吗会影响性能吗A核心实现不到 20 行代码纯函数无依赖引入成本几乎为零。小结 一句话总结 until-async用一行until替代每次的try/catch让[error, data]元组成为你处理 async/await 错误的新习惯。上手三步走npm install until-async安装const [error, data] await until(() ...)替换现有 try/catchTypeScript 项目中传入泛型享受完整的类型收窄就这么简单快去改造你的异步代码吧【免费下载链接】until-asyncGracefully handle Promises using async/await without try/catch.项目地址: https://gitcode.com/gh_mirrors/un/until-async创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表