4

在 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回调似乎不适合动作的流程(它需要从成功的未来或失败的未来返回结果)。

4

1 回答 1

5

对于单个Action,您可以使用 来执行此操作recover,将失败的恢复FutureResult

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在这种情况下是 a PartialFunction[Throwable, Result],因此您可以对错误处理进行更细粒度的处理,并且未在 中定义的任何内容都PartialFunction将保持为 failed Future。更一般地说,您可能可以使用Action实现此功能的自定义定义。

于 2014-06-30T22:18:22.930 回答