Effect 怎么把多供应商 fallback 写成降级链?
用 ExecutionPlan 把「先试 A,重试两次,不行换 B,最后本地兜底」写成一个值:每步提供不同的 Layer,可配 attempts、schedule、while。
哈喽,我是颜sir,询盘自由网背后的人。做网络营销快6年,运气不错,实现了财务自由,目前全职在家钻研更多赚钱方法。在钻研过程中,我发现网上几乎找不到优质的中文资源。我深知新手入门需经历痛苦挣扎,所以创建了询盘自由网,把我知道的分享给你。
用 ExecutionPlan 把「先试 A,重试两次,不行换 B,最后本地兜底」写成一个值:每步提供不同的 Layer,可配 attempts、schedule、while。
ExecutionPlan 有两个观察入口:计划外的 onEvent 看每次尝试,计划内的 CurrentMetadata 读当前步骤。讲清各自能看到什么,以及什么场景用哪个。
Stream.withExecutionPlan 默认在流失败时照常降级,下游会收到第一家的半截输出加第二家的完整输出。讲清 preventFallbackOnPartialStream 能挡什么、挡不住什么。
forkChild 默认让子 fiber 跟着父一起结束。需要任务跑完不受父影响时,用 forkDetach,或把子 fiber 绑到 Scope 上。讲清各自的归属和该由谁负责生命周期。
在 Effect 里,中断是独立于失败和缺陷的第三种结局,表示有人不再需要结果。讲清它在 Exit 里的表示、为什么不该重试或上报,以及中断为什么是协作式的。
函数返回普通值用 map,返回 Effect 用 flatMap;tap 做副作用并保留原值,andThen 是宽松写法。附 pipe 的用法。
Effect.run* 只应出现在程序最外层的入口。讲清为什么在业务逻辑里运行 Effect 会丢掉依赖、取消和错误类型,以及 runPromise、runSync、runFork 怎么选。
三个函数都能把生成器函数体变成可复用的函数,差别在 span 和错误栈帧。这篇用同一段代码把差别摊开,给出应用层、库代码和热路径各自的选法。
Effect.fn(...)(body) 返回的是函数而不是 Effect,所以没有 .pipe。要给它加错误转换、重试、超时,应该把函数写在函数体之后,作为后处理参数。
fnUntracedEager 在调用那一刻就同步执行函数体前缀,比 fnUntraced 更快,但副作用会提前发生。这篇给出它的执行时机和一条很窄的使用规则。
四个 fork 的区别只在子 fiber 挂在哪里、什么时候被中断。用一段会打印生命周期的代码把四个都跑一遍,再给出选择顺序。
forkChild 返回时子 fiber 还没开始跑,先 fork 订阅者再发布消息会丢数据。讲清默认顺序、复现竞态,以及 startImmediately 能保证什么、不能保证什么。
fork 的 uninterruptible 选项取值是 boolean 或 "inherit"。对比三种取值下 Fiber.interrupt 的行为,并说明它适合什么任务、代价是什么。
前端状态混乱,往往因为同一个事实被多处持有。这篇讲 Effect v4 里用 Atom 持有应用状态与异步数据的做法:装哪个包、Layer 怎么注入、写入后怎么自动刷新。
表单最容易出现多个所有者:输入、校验、提交状态各存一份。这篇讲怎么让 Schema 只定义一次校验规则,表单库管输入过程,Atom 管提交之后的应用逻辑。
偏好设置要跨刷新存活,直接读写 localStorage 会把不可信的数据放进应用。这篇讲用 Atom.kvs 加 Schema 做持久化,以及存储后端怎么替换。
接口挂了界面怎么显示,通常要 mock 整个模块。用 Atom 的话,替换 registry 里的 runtime.layer 就行,业务 atom 与组件一行都不用改。
一次出站 HTTP 调用有传输、状态码、解码、超时四种失败。这篇讲怎么用 HttpClient 的组合子把它们分开,并在 service 边界折叠成一个领域错误。
HttpApi 用一份 Schema 驱动的声明派生服务端实现、类型化客户端和 OpenAPI 文档。这篇用一个 users 接口走一遍定义、实现和客户端。
Effect.timeout 放在 retryTransient 的外面,限制的是含全部重试的总预算。用一个总返回 503 的假 client 看它实际怎么截断重试。