2014-06-30 52 views
4

在游戏框架2.3打交道,一个动作可以产生这样从一个成功的未来调用的结果:失败的期货

def index = Action.async { 
    val futureInt = scala.concurrent.Future { intensiveComputation() } 
    futureInt.map(i => Ok("Got result: " + i)) 
} 

但是,如何才能行动对付失败的未来呼叫,即未来的通过呼吁failure()而不是success()完成?

例如,一个动作如何产生一个InternalServerError的结果,并返回未来的失败返回的消息?

onCompleteonFailure回调似乎不适合操作的流程(它需要返回结果,无论是来自成功的未来还是失败的结果)。

回答

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在这种情况下是PartialFunction[Throwable, Result],所以你可以更细粒度的与错误处理,并且任何在PartialFunction中未定义的内容都将保持失败Future。更一般地说,您可以使用自定义的Action来实现这一点。