Effect 深度课effect@4.1.4 · LTS
核心值与组合

L08 运行边界与 Exit:把结果变成值

⏱ 25 min难度 2/5前置:L07
本课目标
  • 区分抛异常与返回 Exit
  • 知道何时用 runPromiseExit / Effect.exit
前置课时尚未完成:L07

可以自行跳转学习,但按顺序推进会更省力;学情分析会把这类缺口归入「前置缺口」。

Exit 是最终判决书

runtime 把 Context<R> + Effect<A,E,R> 解释成 Exit<A,E>:Success(A) 或 Failure(Cause<E>)。Exit 把「结果」也变成值,于是可以对失败做分支、记录、聚合,而不依赖异常控制流。

四种常见出口
← 代码可左右滑动 →
import { Effect, Exit } from "effect"

const program = Effect.fail("nope")

await Effect.runPromise(program)          // 抛出(不推荐直接吃)
const exit = await Effect.runPromiseExit(program) // Exit.fail("nope")

if (Exit.isFailure(exit)) {
  console.log(exit.cause.reasons.map((r) => r._tag))
}

// 在 Effect 内部观察另一个 Effect 的结果
const inner = Effect.gen(function* () {
  const e = yield* Effect.exit(Effect.fail("nope"))
  return Exit.isFailure(e) ? "recovered" : "ok"
})
💡 Effect.exit 把失败「捕获」成 Success 通道里的 Exit 值,是写聚合逻辑与测试断言的常用手法。
💡 Result 与 Exit

v4 还提供 Effect.result,把结果包成 Result(Success / Failure)。在 race 场景里包一层 Result,可以让「第一个完成但失败」也能成为竞速的胜者。

交互演练
关键术语
Exit<A,E>
Success(A) | Failure(Cause<E>) 的运行终态
Result
v4 中表示成功/失败的轻量结果类型,常用于 race
常见误区
× 用 try/catch 包住 runPromise 来处理业务错误——应该改用 Exit 或 catch*。
随堂测验(即时反馈,答题计入掌握度)
Q1runPromiseExit 相比 runPromise 的关键差异?
Q2Effect.exit(inner) 之后,外层程序的 E 通道通常?