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

问题描述

我有一个返回一些 ZIO 的方法

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

调用这个方法返回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)

这应该有效:

next.config.js