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

all*_*cer 3 scala scala-cats zio

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

def method(...): ZIO[Any with clock, SomeError, Unit]
Run Code Online (Sandbox Code Playgroud)

调用此返回的方法Task[Unit]

def otherMethod(..): Task[Unit] = {
   ZIO.effect(method(...))
}
Run Code Online (Sandbox Code Playgroud)

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

zag*_*gyi 6

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

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

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

这应该有效:

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

  • 小点,但从概念上讲,它更类似于“Future[() => Future[A]]”,因为“Future[Future[A]]”即使没有展平也已经在处理,而“Task[Task[A]]” ]` 不会做任何有意义的工作,除非它被展平 (2认同)