繁体   English   中英

Scala, ZIO - 将 Future 转换为 ZIO 或 ZIO 转换为 Future。 可能吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM