2016-04-06 20 views
1

Ist es möglich, asynchron alle Fehler in einer Liste von Futures zu fangen?Scala Catch geworfen Fehler durch eine Sequenz von Futures

Ich war wie an etwas gedacht:

Future { throw Exception } zip Future { throw Exception } recover ... 

Ich aber nehme nur ein Throwable in dem Teil erholen. Irgendeine Idee?

+1

Können Sie fügen sich erholen zu beiden 'Future''s vor dem Zippen? –

+0

Ich zeige ein vereinfachtes Beispiel. Das habe ich tatsächlich gemacht, aber die Sache ist, dass ich die Ausnahmen aller fehlgeschlagenen Futures kombinieren möchte. – vicaba

Antwort

2

zip ‚s docs klar sagen, dass es Fehler von this über die von that (Hervorhebung von mir) bevorzugt:

def zip[U](that: Future[U]): Future[(T, U)] Zips die Werte von this und that Zukunft und schafft eine neue Zukunft hält das Tupel ihre Ergebnisse.

Wenn this Zukunft fehlschlägt, ist die resultierende Zukunft mit der werfen in this gespeicherten fehlgeschlagen. Sonst, wenn that Zukunft fehlschlägt, ist die resultierende Zukunft mit dem in that gespeicherten Throwable gescheitert.

Sie könnten Ihre eigene Funktion zu kombinieren zwei Futures in Future[(Try[T], Try[U])], wie implementieren:

def zipToTry[T,U](a: Future[T], b: Future[U]) 
       (implicit executor: ExecutionContext) 
    : Future[(Try[T], Try[U])] = { 

    val t: Try[T] = a.map { Success(_) }.recover { Failure(_) } 
    val u: Try[U] = b.map { Success(_) }.recover { Failure(_) } 
    t.zip(u) 
} 

(ich habe nicht getestet, aber Sie bekommen die Idee)