回退
使用回退 Effect 与回退值从带类型的失败中恢复。
回退操作符用于从带类型的失败中恢复。defect 与中断保持不变。
catch
Effect.catch 接收错误并返回一个回退 Effect。如果源 Effect 成功,则不会求值该回退。
示例(用另一个 Effect 恢复)
import { Effect } from "effect"
const primary = Effect.fail("primary unavailable")
const program = primary.pipe(
Effect.catch((error) => Effect.succeed(`fallback: ${error}`)),
)
Effect.runSync(program) // => "fallback: primary unavailable"
当只有部分错误通道应触发回退时,请使用 Effect.catchTag、Effect.catchIf 或 Effect.catchFilter。
orElseSucceed
Effect.orElseSucceed 用惰性求值的成功值替换任何带类型的失败,并移除带类型的错误通道。
示例(提供一个默认值)
import { Effect } from "effect"
const program = Effect.fail("missing").pipe(Effect.orElseSucceed(() => 0))
Effect.runSync(program) // => 0
该操作符会处理每一个带类型的错误。如果只有”缺失”或某个特定错误应使用默认值,请先用选择性的 catch 操作符收窄错误范围。
firstSuccessOf
Effect.firstSuccessOf 按顺序运行各个备选方案,并在第一个成功处停止。如果每个 Effect 都失败,则传播最后一个错误。
示例(尝试按优先级排列的备选方案)
import { Effect } from "effect"
const program = Effect.firstSuccessOf([
Effect.fail("primary unavailable"),
Effect.succeed("secondary result"),
Effect.die("not evaluated"),
])
Effect.runSync(program) // => "secondary result"
传入空的可迭代对象会产生一个带有消息 "Received an empty collection of effects" 的 defect。