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

匹配

使用纯函数或 Effect 化的处理函数处理成功与失败的结果。

匹配会消费一个 Effect 的两个通道,并产出一个结果。对于带类型的失败,请使用普通的变体;当还必须考虑 defect 与中断时,请使用 Cause 变体。

match

Effect.match 用纯函数处理带类型的失败或成功。defect 与中断不会被处理。

示例(同时匹配两个通道)

import { Effect } from "effect"

const task: Effect.Effect<number, string> = Effect.fail("unavailable")

const program = Effect.match(task, {
  onFailure: (error) => `failure: ${error}`,
  onSuccess: (value) => `success: ${value}`,
})

Effect.runSync(program) // => "failure: unavailable"

matchEffect

Effect.matchEffect 是 Effect 化的版本:两个处理函数都返回 Effect,并且可能引入新的错误或需求。

示例(运行 Effect 化的处理函数)

import { Effect } from "effect"

const task: Effect.Effect<number, string> = Effect.succeed(42)

const program = Effect.matchEffect(task, {
  onFailure: (error) => Effect.succeed(`failure: ${error}`),
  onSuccess: (value) => Effect.succeed(`success: ${value}`),
})

Effect.runSync(program) // => "success: 42"

matchCause and matchCauseEffect

Effect.matchCause 会把完整的 Cause 传给 onFailure,因此它也能处理 defect 与中断。Effect.matchCauseEffect 是与之对应的 Effect 化版本。

示例(匹配一个 defect)

import { Cause, Effect } from "effect"

const program = Effect.die("boom").pipe(
  Effect.matchCause({
    onFailure: (cause) =>
      Cause.hasDies(cause) ? "terminated by a defect" : "failed",
    onSuccess: () => "succeeded",
  }),
)

Effect.runSync(program) // => "terminated by a defect"

ignore and ignoreCause

Effect.ignore 丢弃成功值,并从带类型的错误中恢复,产出 Effect<void, never, R>。defect 与中断会被保留。

Effect.ignoreCause 还会丢弃每一个失败 cause。请谨慎使用它,因为它可能掩盖 defect。

import { Effect, Exit } from "effect"

Effect.runSync(Effect.ignore(Effect.fail("error"))) // => undefined

const defect = Effect.ignore(Effect.die("boom"))
Effect.runSyncExit(defect) // => Exit.die("boom")

Effect.runSync(Effect.ignoreCause(Effect.die("boom"))) // => undefined