Effect 里 map 和 flatMap 怎么选?
函数返回普通值用 map,返回 Effect 用 flatMap;tap 做副作用并保留原值,andThen 是宽松写法。附 pipe 的用法。
共 169 篇文章带有这个标签。
函数返回普通值用 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 看它实际怎么截断重试。
HttpRouter.toWebHandler 产出 Request 到 Promise<Response> 的函数,正好对上 Workers 的 fetch 入口。重点是把 env bindings 先包成 service,并在模块作用域构建一次。
嵌套的 Effect.provide 会复用外层已构建的 Layer,兄弟 provide 却各自构建。用一个计数器 Layer 数出组合、嵌套、兄弟三种形态各构建几次。
Layer.fresh 把「不共享」写在 Layer 值上,Effect.provide 的 local 选项把它写在调用点上。用带子依赖的 Layer 数出两者各隔离了哪些构建。
嵌套的 Effect.provide 会自动复用 Layer,但兄弟 provide 不会。讲清为什么仍要先组合依赖图、入口只 provide 一次,以及怎么用计数器 Layer 写回归测试。
Effect 4.0.5 里有五个名字相近的资源 API。按「有没有 key、要不要共享、会不会过期」三个问题,几句话就能选对,同时标明哪几个是 unstable。