为什么需要 Effect:async/await 看不见的三件事
教程第 1 章。从一个普通的 async 函数出发,说明签名里看不见的三件事:会怎样失败、依赖了什么、能不能被取消,以及 Effect 如何把它们写进类型。
从 async/await 的三个盲区出发,逐步讲清类型、错误、依赖、并发、资源与工程化。每章只引入一类新概念。(共 23 篇)
第 1 章
教程第 1 章。从一个普通的 async 函数出发,说明签名里看不见的三件事:会怎样失败、依赖了什么、能不能被取消,以及 Effect 如何把它们写进类型。
第 2 章
教程第 2 章。理解 Effect 的核心心智模型:它是对计算的描述而不是计算本身,创建不会执行,只有被运行才会产生副作用,并学会流畅地读 Effect<A, E, R> 三个参数。
第 3 章
教程第 3 章。学会用 Effect.gen 写顺序逻辑,用 pipe 与 map、flatMap、tap 做变换,理解 E 和 R 如何在组合中自动累积,以及为什么 run 只应出现在程序入口。
第 4 章
教程第 4 章。梳理把同步函数、Promise、会抛异常的代码和回调式 API 包装成 Effect 的构造函数,学会在 sync、try、promise、tryPromise、callback 中做选择。
第 5 章
把错误写进 Effect 的 E 参数:区分可预期的失败(failure)与不可预期的缺陷(defect),用 TaggedError 定义领域错误,再用 catchTag 精确恢复并让类型随之收窄。
第 6 章
有了类型化错误之后,真正的问题是设计:错误该由哪一层处理,底层错误在哪里翻译成领域错误,以及为什么重试之前必须先给错误分类。
第 7 章
TypeScript 类型在运行时不存在,边界上的数据只是 unknown。本章讲清 Schema 如何把类型与运行时校验合为一份定义,以及解码、失败与「只在边界校验一次」的原则。
第 8 章
从校验走向建模:用 transform 连接外部表示与内部类型,用 brand 区分形状相同的值,用判别联合让非法状态无法表示,把领域规则写进类型。
第 9 章
Effect 教程第 9 章:为什么依赖应该写进类型而不是藏在 import 里,Context.Service 如何把「能力的接口」与「能力的实现」拆开,R 参数怎样自动汇总依赖,以及服务设计里常见的几种误用。
第 10 章
Effect 教程第 10 章:服务的实现从哪里来。讲清 Layer 的三个参数、provide、provideMerge 与 mergeAll 的区别,资源如何建立与释放,以及依赖图只构建一次的含义。
第 11 章
Effect 教程第 11 章:为什么不该直接读 process.env。讲 Config 是描述、Layer 构造时 fail-fast、withDefault 的边界、Redacted 防泄漏与 ConfigProvider 切换环境。
第 12 章
Effect 教程第 12 章:依赖用 Layer 注入之后测试怎么变简单。讲替身 Layer、用 Effect.flip 断言类型化失败、TestClock 让超时与重试不再真等,以及共享 Layer 的取舍。
第 13 章
用 async/await 的视角理解 fiber:它是什么、为什么子任务必须属于父任务,以及 forkChild、join、interrupt 各自表达的语义。讲清「中断不是失败」与结构化并发的价值。
第 14 章
讲清 Effect.all、Effect.forEach、Effect.race 的语义:默认顺序执行、concurrency 选项如何限制并发度、一个任务失败时其余任务会怎样,以及如何收集全部结果而不是遇错即停。
第 15 章
讲解为什么 try/finally 在异步与中断场景下不够用,以及 Effect 如何用 Scope、acquireRelease 与 finalizer 保证资源一定释放:获取与释放成对、后进先出、中断时同样生效。
第 16 章
外部调用既会慢也会偶发失败。本章讲清 Schedule 为什么是一个可组合的策略值,退避、上限与抖动怎么拼,哪些失败值得重试,以及 timeout 和 retry 谁包着谁。
第 17 章
数据不是一次到齐,而是一批批流过来。本章讲 Stream 是什么、惰性拉取与背压怎样让内存保持有界,常用的构造、变换与消费方式,以及哪些场景用数组或 forEach 更合适。
第 18 章
多个 fiber 要共享数据、互相传递工作或限制并发时,该用哪个原语?本章按「要解决的问题」而不是按 API 来分类:Ref 存值、Queue 派活、PubSub 广播、Semaphore 限流,并讲清各自的边界。
第 19 章
Effect 程序只是描述,总得有人在某个地方真正运行它。本章讲清运行只发生在边缘的含义、为什么长驻进程要构建一个 ManagedRuntime,以及接入 Web 框架和 Cloudflare Workers 时边界该画在哪里。
第 20 章
Effect 把日志、tracing 和指标都做成内置能力,函数加一层包装就能产生 span。但工具不会替你决定该看什么。本章先讲三种信号各自回答什么问题,再讲怎么在代码里挂上去、怎么导出,以及常见的滥用方式。