Future

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

Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP