2014-06-30 51 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來實現這一點。