Effect 怎么只重试特定的错误?
用 Effect.retry 的 while 条件按错误类型筛选,只重试网络抖动和限流,不重试校验失败和资源不存在;缺陷和中断本来就不会被重试。
共 169 篇文章带有这个标签。
用 Effect.retry 的 while 条件按错误类型筛选,只重试网络抖动和限流,不重试校验失败和资源不存在;缺陷和中断本来就不会被重试。
timeout 放在 retry 里面,限制的是每次尝试;放在外面,限制的是总预算。这篇讲清两种写法的差别,以及超时后底层请求到底有没有被取消。
v4 里 STM 模块没有了,换成 Effect.tx 加一组 Tx 数据结构。这篇讲事务模型怎么运转,以及它能保证 Ref 保证不了的什么。
Effect.tx 的事务体会重跑,里面的副作用会重复;内层事务失败也不会单独回滚。这篇用可运行的代码把这几个坑摆出来。
事务里余额不足、队列为空时,不用轮询也不用手拼 Deferred,一行 Effect.txRetry 就能让事务阻塞到相关状态变化。
单值用 Ref,能合并就合并成一个 Ref,多个结构要原子加等条件才用 Tx,要互斥执行异步副作用用 Semaphore。这篇给出判断顺序。
async 函数的签名只写了成功值,失败方式、依赖、取消都在类型之外。这篇说明 Effect 怎样用 Effect<A, E, R> 把它们写进类型,以及它值不值得用。
Promise 创建时就已经在执行,Effect 创建时什么都不会发生。这篇讲清 Effect 是「描述」而不是「过程」,以及它为什么能重试、能被运行器接管。
用 Effect.gen 把顺序逻辑写得像 async/await,yield* 负责运行与错误传播,E 和 R 自动累积。再讲 gen 与 pipe 的分工,以及 Effect.fn 命名函数。
把 JSON.parse、fetch 这类已有代码接进 Effect,关键是决定失败算预期错误还是缺陷。这篇按 sync、try、promise、tryPromise 的选择路径讲清楚。
Effect 把出错分成进类型的 failure 和不进类型的 defect。这篇给出一个判断标准,并讲清 Effect.fail、Effect.die 和 Effect.try 各自落在哪条通道。
有了类型化错误之后,真正的难题是归属:谁来捕获、谁来决策、谁来呈现。这篇给出一套按「谁有足够上下文」划分的判断方法。
TypeScript 类型编译后就被擦除,从外部进来的数据在运行时只是 unknown。用 Effect 的 Schema 把类型和校验写成一份定义,在边界解码一次,内部就能放心信任类型。
形状正确的数据,含义仍可能是错的。用 transform、brand、判别联合三个工具,把外部表示、值的身份和合法状态写进 Schema,让运行时和类型系统共用同一份规则。
用 Context.Service 定义服务接口,业务代码 yield* 取用,依赖自动记进 Effect 的 R 参数,实现留到入口用 Effect.provide 提供。换实现不用改业务代码。
Layer 是「构建一个服务的配方」,用 Layer<ROut, E, RIn> 同时写明产物、构建失败和构建所需。这篇讲清它的构造方式、三个组合子,以及依赖图只构建一次的含义。
直接读 process.env 会把缺项、格式错和密钥泄漏都拖到运行时。这篇讲 Effect 的 Config 怎么把配置变成启动时就校验好的依赖。
用 vi.mock 替换模块,路径一改测试就悄悄失效。Effect 里依赖是服务,替身只是另一个 Layer,这篇讲替身怎么写、失败怎么断言。
用 async/await 的视角讲清 Effect 的 fiber 和结构化并发:子 fiber 的生命周期被包含在父 fiber 之内,以及 forkChild、Fiber.join、Fiber.interrupt 三个基本动作。
Effect.all 和 Effect.forEach 默认是顺序执行,并发度要靠 concurrency 选项显式给出。这篇讲清它能填什么值,以及对数量由数据决定的列表该怎么填。