核心值与组合
L08 运行边界与 Exit:把结果变成值
本课目标
- 区分抛异常与返回 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 通道通常?