【问题标题】:Scala, ZIO - how to convert ZIO to Task and get result?Scala,ZIO - 如何将 ZIO 转换为 Task 并获得结果?
【发布时间】:2021-08-04 02:56:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scala scala-cats zio


    【解决方案1】:

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

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

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

    这应该可行:

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

    【讨论】:

    • 小点,但在概念上它更类似于Future[() => Future[A]],因为Future[Future[A]] 即使没有展平也已经在处理,而Task[Task[A]] 除非展平,否则不会做任何有意义的工作
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 2020-10-22
    • 2021-07-21
    • 1970-01-01
    • 2020-11-01
    • 2022-12-01
    • 2019-06-16
    • 2020-01-30
    相关资源
    最近更新 更多