2014-06-30 9 views
4

In Play Framework 2.3, une action peut produire un résultat d'un appel d'avenir couronné de succès comme celui-ci:Faire face à l'avenir échoué

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

Mais comment un accord d'action avec un futur appel, à savoir, un futur échec que a été complété en appelant le failure() au lieu de success()?

Par exemple, comment une action peut-elle produire un résultat InternalServerError avec le message retourné dans l'échec de l'avenir? Les rappels ne semblent pas correspondre au flux de l'action (ils doivent renvoyer un résultat, que ce soit à partir d'un futur réussi ou échoué).

Répondre

5

Pour un Action, vous pouvez le faire avec recover, la récupération de l'échec Future à un 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 dans ce cas est un PartialFunction[Throwable, Result], de sorte que vous pouvez être plus à grains fins avec votre traitement des erreurs , et tout ce qui n'est pas défini dans le PartialFunction restera un échec Future. Plus généralement, vous pouvez probablement utiliser un Action personnalisé qui implémente ceci.