Je cherche un moyen de convertir une liste de longueur arbitraire de Futures en Future of List. J'utilise Playframework, donc en fin de compte, ce que je veux vraiment, c'est un Future[Result]
, mais pour simplifier les choses, disons simplement que Future[List[Int]]
la façon normale de faire cela serait d'utiliser Future.sequence(...)
mais il y a une torsion ... La liste que l'on me donne a généralement environ 10-20 futurs, et il n'est pas rare que l'un de ces futurs échoue (ils font des demandes de service Web externes). Au lieu d'avoir à les réessayer tous au cas où l'un d'eux échouerait, j'aimerais pouvoir accéder à ceux qui ont réussi et les renvoyer.
Par exemple, faire ce qui suit ne fonctionne pas
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scala.util.Failure
val listOfFutures = Future.successful(1) :: Future.failed(new Exception("Failure")) ::
Future.successful(3) :: Nil
val futureOfList = Future.sequence(listOfFutures)
futureOfList onComplete {
case Success(x) => println("Success!!! " + x)
case Failure(ex) => println("Failed !!! " + ex)
}
scala> Failed !!! java.lang.Exception: Failure
Au lieu d'obtenir la seule exception, j'aimerais pouvoir retirer les 1 et 3 de là. J'ai essayé d'utiliser Future.fold
, mais cela n'appelle apparemment que Future.sequence
dans les coulisses.
Merci d'avance pour l'aide!
.recover
était en effet la pièce manquante pour moi.