已发布 上游基线 bf46254 原文 ↗ 在 GitHub 编辑

回退

使用回退 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.catchTagEffect.catchIfEffect.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。