Sto cercando un modo per convertire un elenco di future di lunghezza arbitraria in un futuro di elenco. Sto usando Playframework, quindi alla fine quello che voglio veramente è un fileFuture[Result]
, ma per rendere le cose più semplici, diciamo solo che Future[List[Int]]
il modo normale per farlo sarebbe usare Future.sequence(...)
ma c'è una svolta ... L'elenco che mi viene dato di solito ha circa 10-20 futures in esso, e non è raro che uno di questi futures fallisca (stanno facendo richieste di servizi web esterni). Invece di dover riprovare tutti loro nel caso in cui uno di loro fallisca, mi piacerebbe essere in grado di ottenere quelli che sono riusciti e restituirli.
Ad esempio, fare quanto segue non funziona
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
Invece di ottenere l'unica eccezione, mi piacerebbe essere in grado di estrarre l'1 e il 3 da lì. Ho provato a usareFuture.fold
, ma a quanto pare questo chiama solo Future.sequence
dietro le quinte.
Grazie in anticipo per l'aiuto!
.recover
era davvero il pezzo mancante per me.