我可以处理Future [Option [user]]的各种模式是什么?

时间:2015-12-06 00:42:17

标签: scala playframework future

我有一个返回Future [Option [User]]

的方法
def insertUser(...): Future[Option[User]] = { ... }

在我的控制器中,我目前正在这样做:

val futureUser = userService.insertUser(...)

Scala有哪些各种模式可以处理这个未来最终返回选项[用户]?

1 个答案:

答案 0 :(得分:4)

处理 monad Future)包装另一个 monad Option)的数据结构的最佳方法是使用 Monad Transformer (我假设你一般都熟悉monad的概念。)

例如,我们可以制作monad变换器OptionT

final case class OptionT[F[_], A](run: F[Option[A]]) {
  def fold[X](some: A => X, none: => X)(implicit F: Functor[F]): F[X] = 
    F.map(run) {
      case None => none
      case Some(a) => some(a)
    }
}

然后,我们可以像这样操作内部monad(Option):

val futureOption = OptionT(Future(Right("Yes")))

futureOption.fold(identity, "No") // Future[String]: Future("Yes")

正如您所看到的,使用monad变换器(Future[Option[A]] => Future[A]

可以直接使用内部monad

要回答您的问题,要从Option[User]返回Future[Option[User]],您将不可避免地需要阻止 Await.result,当然非常气馁。

在Web服务器上下文中的应用程序代码中,您永远不必通过利用 monad从开始(收到请求)到结束(发送响应)离开上下文Future变形金刚如上所述。

关于播放框架,您可以使用Action.async方法直接传递Future[A]作为回复。