知识合集

哈喽,我是颜sir,询盘自由网背后的人。做网络营销快6年,运气不错,实现了财务自由,目前全职在家钻研更多赚钱方法。在钻研过程中,我发现网上几乎找不到优质的中文资源。我深知新手入门需经历痛苦挣扎,所以创建了询盘自由网,把我知道的分享给你。

如何用 effect/cli 的 Prompt 做交互式表单?

用 Prompt.all 把 String、Select、Confirm 组合成一个表单,再用 Prompt.run 执行并拿到类型化的结果;说明它需要哪个服务,以及哪些提问类型我没有验证。

Effect.all 里一个任务失败,其余任务会怎样?

并发模式下 Effect.all 和 Effect.forEach 遇到一个失败会整体失败并中断其余任务。想让每个任务各自独立、最后统一汇总成败,用 Effect.result 或 mode 为 result。

Effect.race 和 Effect.raceFirst 有什么区别?

Effect.race 取第一个成功的,先失败的会被忽略直到两个都失败;Effect.raceFirst 取第一个结束的,不论成败。这篇讲清两者的取舍。

Effect 测试里怎么替换环境变量配置?

测试想换一组配置,不必改全局环境变量。这篇讲怎么用 ConfigProvider 给 Config 换来源,以及什么时候干脆绕过 Config。

Effect 的 Redacted 怎么防止密钥泄漏到日志?

密钥一旦以普通字符串进了日志就收不回来。这篇讲 Effect 的 Redacted 怎么让打印、字符串化和 JSON 序列化都只显示 redacted,以及它防不住什么。

Effect v4 里 FiberRef 去哪了?

effect@4.0.5 里 FiberRef 模块已经不存在,取代它的是 Context.Reference,一个带默认值的服务键。这篇讲它怎么定义、怎么覆盖,以及覆盖在嵌套和 fork 时的行为。

覆盖 CurrentLogAnnotations 为什么会丢注解?

直接用 provideService 覆盖 References.CurrentLogAnnotations 是整体替换,不是合并。这篇用跑过的输出说明它和 Effect.annotateLogs 的区别。

Reference 和 Service 该用哪个?

Reference 把依赖从类型里藏起来,忘记 provide 时静默用默认值。判断标准只有一条:缺失时有没有安全的默认值。

Effect 里失败了该直接重试吗?

失败就重试是个危险的默认。重试的前提是错误是暂时性的,所以顺序必须是先分类,再用 Effect.retry 的 while 谓词只重试值得重试的错误。

Effect 里怎么统一上报错误?

用 ErrorReporter 把「怎么上报」放进环境,用 ignore、severity、attributes 三个标注决定每个错误报不报、多严重、带什么上下文。附最小可运行示例。

Effect 的 HTTP 服务端报错会自动上报吗?

内置的 HTTP 服务端边界会触发 ErrorReporter:500 上报,404 不上报。但 reporter layer 必须出现在最终装配的 layer 里,用 provide 喂给路由会收不到。

ErrorReporter 里 defect 为什么也是 Info?

ErrorReporter 解析 severity 时,没有标注就一律是 Info,defect 也不例外。这篇给出后果,以及在上报器里按 cause 升级 severity 的最小做法。

Effect 的 catchTag 怎么精确捕获错误?

catchTag 按 _tag 捕获一种 failure,并让类型里的 E 随之收窄;catchTags 一次处理多种,catch 则会吞掉将来新增的错误。

Effect 的 defect 要在哪里处理?

catch 和 catchTag 碰不到 defect。这篇讲 defect 该由最外层、Effect.exit 或 catchCause 去看,以及 Effect.result 和 Effect.orDie 的区别。

Effect 的 Data.TaggedError 怎么用?

用 Data.TaggedError 给每种 failure 一个带 _tag 的类,让错误可区分、可精确捕获。也讲 Schema.TaggedError 什么时候该换上。