Scala Future
ZIO 现在提供了与 Scala 的 Future
的基本互操作性,并且不需要额外的模块提供支持。
转换自 Future
可以使用 ZIO.fromFuture
将 Scala 的 Future
转换为 ZIO effect:
def loggedFuture[A](future: ExecutionContext => Future[A]): UIO[Task[A]] = {
ZIO.fromFuture { implicit ec =>
future(ec).flatMap { result =>
Future("Future succeeded with " + result).map(_ => result)
}
}
}
Scala 的 Future
也可以使用 Fiber.fromFuture
转换为 Fiber:
def futureToFiber[A](future: => Future[A]): Fiber[Throwable, A] =
Fiber.fromFuture(future)
这是一个纯操作,因此于任何纤程执行公平性而言都是一个明智的注脚。
转换到 Future
ZIO Task
effect 可以通过 ZIO#toFuture
转换为 Future
:
def taskToFuture[A](task: Task[A]): UIO[Future[A]] =
task.toFuture
因为将 Task
转换为(即时的)Future
是效果化的,所以 ZIO#toFuture
的返回值是一个 effect。要真正开始执行 Future
并访问其中,必须使用 runtime 来执行 effect。
ZIO Fiber
可以通过 Fiber#toFuture
转换为 Future
:
def fiberToFuture[A](fiber: Fiber[Throwable, A]): UIO[Future[A]] =
fiber.toFuture
执行 Future
Runtime
类型具有方法 unsafeRunToFuture
,该方法可以异步执行 ZIO effect,并在 effect 执行完成时返回 Future
。