如何处理 playframework 控制器内的未来选项?
How to handle a future option inside of a playframework controller?
我目前的方法调用具有以下签名:
val article:Future[Option[Article]] = articleService.getById(1)
我的控制器看起来像:
def show(id: Int) = Action.async { request =>
articleService.getById(id).onSuccess {
case articleOpt => {
articleOpt.map{
article => Ok("....")
}
}
}
Ok("fail")
}
有没有更简洁的方法来处理 Future[Option[Model]]
?
def show(id: Int) = Action.async { request =>
articleService.getById(id).map {
case Some(article) => Ok(article)
case None => Ok("...")
}.recover{case ex => Ok("fail")}
}
更简洁的方法需要像 scalaz 一样使用 smth ReaderT
可能是这样的
def show(id: Int) = Action.async { request =>
articleService.getById(id) map { op =>
op match {
case Some(acle) => Ok(s"found: ${acle.name}")
case None => NotFound("Not found")
}}
}
你也可以使用 scalaz monad transformer OptionT:
import scalaz.OptionT
def show(id: Int) = Action.async {
OptionT(articleService.getById(id))
.map(a => Ok(s"found: ${a.name}"))
.getOrElse(NotFound("Not found"))
}
我目前的方法调用具有以下签名:
val article:Future[Option[Article]] = articleService.getById(1)
我的控制器看起来像:
def show(id: Int) = Action.async { request =>
articleService.getById(id).onSuccess {
case articleOpt => {
articleOpt.map{
article => Ok("....")
}
}
}
Ok("fail")
}
有没有更简洁的方法来处理 Future[Option[Model]]
?
def show(id: Int) = Action.async { request =>
articleService.getById(id).map {
case Some(article) => Ok(article)
case None => Ok("...")
}.recover{case ex => Ok("fail")}
}
更简洁的方法需要像 scalaz 一样使用 smth ReaderT
可能是这样的
def show(id: Int) = Action.async { request =>
articleService.getById(id) map { op =>
op match {
case Some(acle) => Ok(s"found: ${acle.name}")
case None => NotFound("Not found")
}}
}
你也可以使用 scalaz monad transformer OptionT:
import scalaz.OptionT
def show(id: Int) = Action.async {
OptionT(articleService.getById(id))
.map(a => Ok(s"found: ${a.name}"))
.getOrElse(NotFound("Not found"))
}