我创建了我的服务的两个版本。第一个使用 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
方法以将其与两种服务一起使用?我这里需要有共同的返回类型。
或者也许有其他方法可以解决这个问题?
最佳答案
你必须决定你的函数是返回 Future
还是 ZIO
并且这不能依赖于你的代码片段中像 version
这样的运行时值(除非当然,您将返回类型定义为 AnyRef
- 不是很有用)。
如果你的程序的其余部分是基于 Future
s 的,但你想开始在某些服务中引入 ZIO
,你可以通过自己使用 执行你的效果来做到这一点>runtime.unsafeRun(效果)
:
val runtime = Runtime.default
def returnDataFromServiceVersion(version: Int): Future[Data] = {
runtime.unsafeRunToFuture(
zioService.get(...)
)
}
更多详情请引用Running Effects在官方 ZIO 文档中。
关于Scala, ZIO - 将 Future 转换为 ZIO 或 ZIO 转换为 Future。可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62678605/