scala - 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]]
)。
为了将 aZIO[R, E, A]
变成 a Taks[A]
,您必须了解后者只是 的类型别名ZIO[Any, Throwable, A]
,这表明您必须
- 消除对环境的依赖
R
(通过提供环境) - 如果它还不是它的子类型(例如 by ) ,则将错误类型
E
转换为Throwable
.mapError
这应该有效:
def otherMethod(..): Task[Unit] =
method(...)
.mapError(someError => new RuntimeException(s"failed with: $someError"))
.provideLayer(Clock.live)
推荐阅读
- angular - 如何像使用 Promises 或 async/await 一样链接 observables?
- asp.net-core - B2C 注册和登录政策 - 自助重置密码重定向回更改密码
- python - sqlite3.OperationalError:靠近“<”:语法错误
- reactjs - 在 react-three-fiber/drei/Three.js 中两次使用相同的 GLTF 模型
- javascript - 带有引导程序,ajax laravel 的进度条
- javascript - 在 react-native 中使用 WebSocket
- apache-spark - 如何在struct select spark sql中获取聚合列?
- java - 如何从android 11中的URI获取realpath
- python - 在 jupyter notebook 中,是否可以在替换行中打印更新值?
- javascript - 构建一个 javascript 库 / 未捕获的 SyntaxError: import not found: elementToSVG