如何处理 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"))
}