[英]Scala, ZIO - convert Future into ZIO or ZIO into Future. Is it possible?
我创建了两个版本的服务。 第一个使用Futures
,另一个使用ZIO
作为效果。
我有一个简单的方法,它使用Future
作为结果效果:
def get(id: String)(implicit executionContext: ExecutionContext): Future[Data]
我还有一些使用ZIO[SomeEnv, SomeError, Data]
其他版本:
def get(id: String): ZIO[SomeEnv, SomeError, Data]
现在,我需要创建某种适配器,它将从一个版本或另一个版本返回数据:
def returnDataFromServiceVersion(version: Int) : ??? = {
if(version == 1) futureService.get(...)
else zioService.get(...)
}
这里的问题是返回类型。 我不知道如何将ZIO
转换为 future 或Future
转换为ZIO
以具有共同的返回类型。 我尝试使用ZIO.fromFuture{...}
或toFuture()
但它没有帮助。 我的问题是 - 如何创建此returnDataFromServiceVersion
方法以将其与两种服务一起使用? 我需要在这里有共同的返回类型。
或者也许有另一种方法来解决这个问题?
如果我理解正确你想要的是常见的ZIO
类型,它看起来像这样ZIO[SomeEnv, SomeError, Data]
这可以使用ZIO.fromFuture
并将Throwable
(这是Future
失败类型)映射到您的SomeError
来实现:
case class Data(data: String)
case class SomeEnv(env: String)
case class SomeError(err: String)
object SomeError {
def fromThrowable(throwable: Throwable) = SomeError(throwable.toString)
}
def getFuture(id: String)(implicit executionContext: ExecutionContext): Future[Data] = ???
def getZIO(id: String): ZIO[SomeEnv, SomeError, Data] = ???
def returnDataFromServiceVersion(version: Int): ZIO[SomeEnv, SomeError, Data] =
if (version == 1)
ZIO
.fromFuture(executionContext => getFuture("id")(executionContext))
.mapError(SomeError.fromThrowable)
else
getZIO("id")
您必须决定您的 function 是返回Future
还是ZIO
,这不能依赖于代码片段中的运行时值(如version
)(当然,除非您将返回类型定义为AnyRef
- 不是很有用)。
如果您的程序的 rest 是基于Future
的,但您想开始在某些服务中引入ZIO
,您可以通过使用runtime.unsafeRun(effect)
自己执行效果来做到这一点:
val runtime = Runtime.default
def returnDataFromServiceVersion(version: Int): Future[Data] = {
runtime.unsafeRunToFuture(
zioService.get(...)
)
}
有关更多详细信息,请参阅官方 ZIO 文档中的运行效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.