在Play Framework 2.3中,操作可以通过以下成功的未来调用生成结果:
def index = Action.async {
val futureInt = scala.concurrent.Future { intensiveComputation() }
futureInt.map(i => Ok("Got result: " + i))
}
但是,如何通过调用failure()
而不是success()
来处理未来失败的电话,即未来的未来?
例如,一个动作如何产生一个InternalServerError
结果,并在未来的失败中返回该消息?
onComplete
和onFailure
回调似乎不适合行动的流程(它需要从成功的未来或失败的结果返回结果)。
答案 0 :(得分:5)
对于单个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) }
}
在这种情况下, recover
是PartialFunction[Throwable, Result]
,因此您可以更好地处理错误处理,PartialFunction
中未定义的任何内容都将保持失败{{} 1}}。更一般地说,您可以使用实现此目的的自定义Future
。