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

标签 scala future scala-cats zio

我创建了我的服务的两个版本。第一个使用 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 - 不是很有用)。
如果你的程序的其余部分是基于 Futures 的,但你想开始在某些服务中引入 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/

相关文章:

scala - 使用 Akka、SQS 和 Camel 的消费者投票率

Scala:哈希忽略初始大小(数十亿条目的快速哈希表)

scala - 使用关联和交换运算符折叠/减少 future 列表

scala - Cats Scala 中的序列和遍历来映射类型

scala - 使用 scala fs2 文件流从文件中删除过滤行

scala - 使用 sbt-release 指定自定义 git 标签

asynchronous - Flutter 异步代码中错误的执行顺序

r - 从 future 中调用 Shiny 的 JavaScript 回调

scala - 使用 Scala 中的 QueryParamDecoder 解码可选查询参数

sqlite - 如何将库依赖添加到 Build.scala 的类路径?