我有一个返回Future [Option [User]]
的方法def insertUser(...): Future[Option[User]] = { ... }
在我的控制器中,我目前正在这样做:
val futureUser = userService.insertUser(...)
Scala有哪些各种模式可以处理这个未来最终返回选项[用户]?
答案 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]
)
要回答您的问题,要从Option[User]
返回Future[Option[User]]
,您将不可避免地需要阻止 Await.result
,当然非常气馁。
在Web服务器上下文中的应用程序代码中,您永远不必通过利用 monad从开始(收到请求)到结束(发送响应)离开上下文Future
变形金刚如上所述。
关于播放框架,您可以使用Action.async
方法直接传递Future[A]
作为回复。