Effect 怎么保证资源一定被释放?
try/finally 在异步和取消场景下管不住资源释放。这篇讲 Effect 如何用 Scope、acquireRelease 和 finalizer,让获取与释放成对、后进先出,并且在中断时同样生效。
共 169 篇文章带有这个标签。
try/finally 在异步和取消场景下管不住资源释放。这篇讲 Effect 如何用 Scope、acquireRelease 和 finalizer,让获取与释放成对、后进先出,并且在中断时同样生效。
用 Schedule 把重试策略写成一个独立的值:指数退避、次数上限、抖动各一个原语,组合起来贴到任何 Effect 上,不用手写循环。
Stream 是「多值的 Effect」:惰性、类型化、可中断,靠拉取式运行获得背压。这篇讲它和 Effect 的关系、背压怎样工作,以及构造、变换、消费三步怎么写。
多个 fiber 要共享数据、互相传递工作或限制并发时,该用哪个原语?按「要解决的问题」来选:Ref 存值、Queue 派活、PubSub 广播、Semaphore 限流。
在 service 方法里就地 runPromise 看起来很省事,却会让中断、依赖和错误类型三处同时断开。这篇讲清 run 应该只发生在边缘,以及不同宿主下边缘分别在哪。
Effect 把日志、span 和指标都做成内置能力,但工具不会替你决定该看什么。先分清三种信号各回答什么问题,再决定在哪些边界上挂它们。
HTTP、SQL、RPC 都是跨进程调用,面对同样的四个问题。这篇讲 Effect 怎样用同一个形状处理它们,并用 HttpClient 写出一个带超时和错误翻译的完整例子。
约定写在文档里会过期,全做成 lint 又会被整体关掉。按「能不能被确定的程序判定」把约定分成语法、类型、依赖与语境四层,前三层交给机器,语境层留给人。
十一种典型的 Effect 误用,每一种都能编译、能跑,却悄悄丢掉了 Effect 本该给你的某个保证。这篇讲其中最根本的七种,其余几种各有单独的文章。
在 effect 4.0.5 上逐条核对的 v3 到 v4 迁移路线:先让编译器和 language service 列待办,再按改名、模块搬家、服务与 Schema、行为差异的顺序处理。
改名编译器会帮你找,但 runPromise 拒绝值、Option 不能 yield*、TimeoutError、runCollect 返回数组这些运行时才露出来。逐条对照 v3 与 v4。
Effect v4 里 Schema.decodeUnknown、Union、optionalWith、Config.string 等都变了。列出最常撞上的改名,以及 decode 含义变化这个陷阱。
Effect v4 里 Effect.Service、Context.Tag、Layer.scoped 都不存在了,统一用 Context.Service 与 Layer.effect。附带可运行的资源释放示例。
用一句话读懂 Effect<A, E, R>:需要 R,可能以 E 失败,成功给 A。顺带讲清 never 在这里表示「没有」,以及为什么 R 变成 never 才能运行。
Effect.succeed(Date.now()) 每次运行拿到的是同一个时间戳,Effect.sync(() => Date.now()) 每次都重新计算。讲清两者的求值时机,以及副作用该放在哪里。
Promise 本身没有取消,社区靠 AbortController 约定补上。这篇说明这个约定哪里会漏,以及 Effect 把取消做成机制是什么意思。
catch 里的错误是 unknown,async 函数的签名也不记录会抛什么。这篇说明原因,以及 Effect 用类型里的 E 解决了什么。
模块级 ManagedRuntime 放静态 Layer,每个请求取一次 context,env 做成请求级 Service。这篇给出完整写法,以及在 Workers 上不该做的几件事。
两个来自 GitHub issue 的问题:HttpClient 未读取响应的 FinalizationRegistry,和比请求活得更久的长寿 fiber。我没有复现,这里只写我读到的和保守的规避做法。
在 fetch handler 里 Effect.provide(layer),每个请求都会重新构建一遍 Layer。用一个计数器量化三种写法的构建次数,并说明多个 runtime 时怎么共享 memo map。