Fer*_*eia 4 future playframework playframework-2.3
在Play Framework 2.3中,一个动作可以产生一个成功的未来调用的结果,如下所示:
def index = Action.async {
val futureInt = scala.concurrent.Future { intensiveComputation() }
futureInt.map(i => Ok("Got result: " + i))
}
Run Code Online (Sandbox Code Playgroud)
但是,一个行动如何处理未来失败的呼吁,即通过呼叫failure()而不是通过呼叫完成的未来success()?
例如,一个动作怎么能产生一个InternalServerError结果,并且在未来的失败中可以抛出消息?
onComplete并且onFailure回调似乎不适合动作的流程(它需要从成功的未来或失败的结果返回结果).
对于单个Action,您可以执行此操作recover,将失败的恢复Future到Result:
def index = Action.async {
val futureInt = scala.concurrent.Future { intensiveComputation() }
futureInt.map(i => Ok("Got result: " + i))
.recover{ case e: Exception => InternalServerError(e.getMessage) }
}
Run Code Online (Sandbox Code Playgroud)
recover在这种情况下是一个PartialFunction[Throwable, Result],因此您可以更精细地处理错误,并且PartialFunction遗嘱中未定义的任何内容仍然是失败的Future.更一般地说,您可以使用Action实现此目的的自定义.