Scala、ZIO - 将 Future 转换为 ZIO 或将 ZIO 转换为 Future。是否可以?

all*_*cer 4 scala future scala-cats zio

我创建了两个版本的服务。第一个使用Futures,另一个使用ZIO效果。

我有一个简单的方法,使用Future结果效果:

def get(id: String)(implicit executionContext: ExecutionContext): Future[Data]
Run Code Online (Sandbox Code Playgroud)

我还有一些其他版本使用ZIO[SomeEnv, SomeError, Data]

def get(id: String): ZIO[SomeEnv, SomeError, Data]
Run Code Online (Sandbox Code Playgroud)

现在,我需要创建某种适配器,它将从一个版本或另一个版本返回数据:

def returnDataFromServiceVersion(version: Int) : ??? = {
   if(version == 1) futureService.get(...)
   else zioService.get(...)
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是返回类型。我不知道如何转换ZIO为未来或Future转换ZIO为具有共同的返回类型。我尝试使用ZIO.fromFuture{...}ortoFuture()但没有帮助。我的问题是 - 如何创建此returnDataFromServiceVersion方法以将其与这两种服务一起使用?我需要在这里有共同的返回类型。

或者也许有另一种方法可以解决这个问题?

zag*_*gyi 6

您必须决定您的函数是否返回Futureor ZIO,并且这不能取决于version代码片段中的运行时值(当然,除非您将返回类型定义为AnyRef- 不是很有用)。
如果您的程序的其余部分基于Futures,但您想开始引入ZIO某些服务,您可以通过使用以下命令自行执行效果来实现runtime.unsafeRun(effect)

val runtime = Runtime.default

def returnDataFromServiceVersion(version: Int): Future[Data] = {
  runtime.unsafeRunToFuture(
    zioService.get(...)
  )
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅ZIO 官方文档中的运行效果。