首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala,ZIO -将Future转换为ZIO或将ZIO转换为Future。有可能吗?

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

Stack Overflow用户
提问于 2020-07-01 22:01:40
回答 2查看 792关注 0票数 3

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

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

代码语言:javascript
复制
def get(id: String)(implicit executionContext: ExecutionContext): Future[Data]

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

代码语言:javascript
复制
def get(id: String): ZIO[SomeEnv, SomeError, Data]

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

代码语言:javascript
复制
def returnDataFromServiceVersion(version: Int) : ??? = {
   if(version == 1) futureService.get(...)
   else zioService.get(...)
}

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

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

EN

回答 2

Stack Overflow用户

发布于 2020-07-01 22:26:36

您必须决定您的函数返回的是Future还是ZIO,这不能依赖于代码片段中的运行时值,如version (当然,除非您将返回类型定义为AnyRef -这不是很有用)。

如果程序的其余部分是基于Future的,但您想要在某些服务中引入ZIO,则可以通过使用runtime.unsafeRun(effect)自己执行效果来实现这一点。

代码语言:javascript
复制
val runtime = Runtime.default

def returnDataFromServiceVersion(version: Int): Future[Data] = {
  runtime.unsafeRunToFuture(
    zioService.get(...)
  )
}

有关更多详细信息,请参阅官方ZIO文档中的Running Effects

票数 5
EN

Stack Overflow用户

发布于 2020-07-01 22:22:27

如果我没理解错的话,您想要的是像下面这样的ZIO[SomeEnv, SomeError, Data]的通用ZIO类型

这可以通过使用ZIO.fromFuture并将Throwable ( Future故障类型)映射到您的SomeError来实现

代码语言:javascript
复制
  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")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62678605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档