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)
我有一个 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)