DevTrends开发者趋势
主题色

iplaylf2 /

shajara

大家好,我做了 shajara,一个 JavaScript/TypeScript 的结构化并发库。 它不是 Promise 的替代品,而是给 Promise、回调、定时器、fetch(...)、WebSocket 等异步工作补上一层生命周期结构。 很多异步代码的问题不在“怎么 await 一个结果”,而在旁边那些被启动的工作没人说得清: 它属于哪个请求、页面、面板或任务? 父流程失败时,它该不该被取消? 回调晚到时,还能不能写入结果? …

DT安全与测试DT软件开发DT内容 / 资源

关于

大家好,我做了 shajara,一个 JavaScript/TypeScript 的结构化并发库。 它不是 Promise 的替代品,而是给 Promise、回调、定时器、fetch(...)、WebSocket 等异步工作补上一层生命周期结构。 很多异步代码的问题不在“怎么 await 一个结果”,而在旁边那些被启动的工作没人说得清: 它属于哪个请求、页面、面板或任务? 父流程失败时,它该不该被取消? 回调晚到时,还能不能写入结果? 外部资源应该什么时候清理? shajara 关注的不是把异步调用写短,而是让异步工作有明确归属和可预期的收尾。 核心模型 shajara 用 JavaScript generator function 写 routine,用 yield 标出 routine 把控制交给运行时的位置。运行时会把工作放进一棵 scope tree: spawn(...) 在当前 scope 里启动 process。 branch(...) 创建 child scope。 future、channel、resource、AbortSignal 等句柄,都由创建它们的 scope 拥有。 scope 收敛时,会先收拢自己拥有的 child scope、process 和句柄,再把最终结果交给等待方。 一个例子 ts import { run, sleep } from "@shajara/host"; import { branch, spawn } from "@shajara/host/primitives"; const result = await run(function saveProfile() { return yield branch(function saveProfileScope() { yield spawn(function writeAuditTrail() { yield sleep(30); return "audit written"; }); yield sleep(5); return "profile saved"; }); // writeAuditTrail 结束后,才得到 "profile saved"。 }); 这里 saveProfileScope 这段入口 routine 很快就返回了,但 branch(...) 等待的是整个 child scope,不只是这一个 function 的返回值。因为 writeAuditTrail 也是这个 child scope 拥有的 process,所以调用方会在它结束后才拿到 "profile saved"。这就是 shajara 文档里说的结构化收敛:调用方不用手动追踪 child scope 里每个后台任务,scope 会把自己拥有的工作收拢到一个结果边界。 失败与取消 失败和取消也沿着同一套结构处理。如果 child scope 中某个 process 抛错,这个 scope 会先取消自己拥有的其余工作,再让调用方在 branch(...) 的位置收到 ScopeError。如果某段后台工作失败后不应该影响同一个 scope 里的其他工作,就在这个 process 边界内把错误转换成普通结果,而不是等到外层 wait(...) 再补救。 和现有异步代码的关系 它和现有 Promise/回调代码的关系更像“把异步边界放回结构里”: until(...) 把已有 Promise 带入 routine 控制流。 all(...) / race(...) 表达常见并发组合,其中 race(...) 会在返回胜出值前取消未胜出的 routine。 completer(...) 和 feed(...) 分别把回调的一次结果和连续事件桥接成 future/channel。 abortSignal(...) 把原生 fetch(...) 这类 API 的取消绑定到当前 scope。 resource(...) 让 WebSocket 等外部资源在就绪后继续附着到所属 scope,并在 scope 释放时运行清理逻辑。 文档与演示 项目文档站有中文和英文文档,不只是 API 列表。文档按 Guides、Topics、Concepts 三层组织:先教怎么把 Promise、scope、外部句柄放进 routine,再解释 future、channel、context、recovery,最后展开 scope tree、句柄归属和 scope 退出语义。站内还有 Flow Explorer,可以用流程图回放 single spawn、future 完成、scope 拥有的工作、fork/join、失败触发取消、恢复边界、有界 channel 等场景。

收录记录

  1. 阮一峰周刊·用户投稿

    2026年6月1日 · 1 次收录

讨论这个产品