Scala,ZIO - 如何将 ZIO 转换为 Task 并获得结果?

Scala, ZIO - how to convert ZIO to Task and get result?

我有一个 return 一些 ZIO 的方法:

def method(...): ZIO[Any with clock, SomeError, Unit]

调用这个的方法 return Task[Unit]:

def otherMethod(..): Task[Unit] = {
   ZIO.effect(method(...))
}

问题是当我用 ZIO.effect 调用它时我没有得到结果。 我应该如何将 ZIO 转换为 Task 以获得结果?

使用 ZIO.effect(method(...)) 你会得到一个 Task[ZIO[...]],这很少是你想要的(它在概念上类似于嵌套的 Future[Future[A]])。

为了将 ZIO[R, E, A] 变成 Taks[A],你必须明白后者只是 ZIO[Any, Throwable, A] 的类型别名,这表明你必须

  • 消除对环境的依赖R(通过提供)
  • 将错误类型 E 转换为 Throwable 如果它还不是它的子类型(例如 .mapError

这应该有效:

def otherMethod(..): Task[Unit] =
  method(...)
    .mapError(someError => new RuntimeException(s"failed with: $someError"))
    .provideLayer(Clock.live)