Szukam sposobu na przekonwertowanie dowolnej długości listy kontraktów futures na przyszłość listy. Używam Playframework, więc ostatecznie naprawdę chcę Future[Result]
, ale żeby wszystko było prostsze, powiedzmy, że Future[List[Int]]
Normalnym sposobem byłoby użycie, Future.sequence(...)
ale jest pewien zwrot akcji ... Lista, którą otrzymuję, zwykle ma około 10-20 kontraktów futures i nierzadko zdarza się, że jedna z nich zawodzi (wykonują zewnętrzne żądania usług internetowych). Zamiast ponawiać próby wszystkich z nich w przypadku, gdy jeden z nich zawiedzie, chciałbym mieć możliwość uzyskania dostępu do tych, którym się powiodło, i zwrócenia tych.
Na przykład wykonanie poniższych czynności nie działa
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
Zamiast otrzymywać jedyny wyjątek, chciałbym móc wyciągnąć stamtąd 1 i 3. Próbowałem użyć Future.fold
, ale to najwyraźniej tylko dzwoni Future.sequence
za kulisami.
Z góry dziękuję za pomoc!
.recover
był rzeczywiście brakującym elementem dla mnie.