2014-09-20 14 views
9

Vor diesem CodeWas die Verwendung von Scala Future.fallbackTo ist

val f1: Future[Int] = Future { 5 } //Future.failed(new Exception("sorry")) 
val f2: Future[Int] = Future { 6 } 

val result : Future[Int] = f1.fallbackTo { 
    println("Fall back to that F") 
    f2 
} 

Ergebnis das Ergebnis von f1 enthält. Der Code im FallbackTo-Block wird jedoch ausgeführt, unabhängig davon, ob f1 fehlschlägt oder nicht. Ich habe erwartet, dass der FallbackTo-Block nur ausgeführt wird, wenn f1 fehlschlägt.

Vielleicht ist mein Beispiel zu einfach (oder nur falsch), aber was ist die Verwendung von FallbackTo?

+0

Dies scheint Ihr Problem bezogen werden: https: //issues.scala-lang. org/browse/SI-6913 –

Antwort

19

Sie sind richtig, f1 zurückgegeben, wenn es erfolgreich ist, wenn nicht f2, der Druck, den Sie sehen, ist aufgrund der Tatsache, dass der Block nicht faul ausgewertet:

def fallbackTo[U >: T](that: Future[U]): Future[U] 

So scheint es, dass f2 ist gestartet, wenn es an fallbackTo übergeben wird (und daher die print-Anweisung ausgeführt wird). Wahrscheinlich ist es eine Design-Wahl, wenn es faul ausgewertet worden wäre f2 wäre nur nach dem Fehler von f1 gestartet worden.

Wenn Sie diese Art von Verhalten vermeiden Sie recoverWith verwenden können, die erst nach einem Ausfall ausgelöst wird:

f1.recoverWith{ case _ => println(123); Future { 6 } } 
+2

In diesem Fall wird f2 parallel zu f1 ausgeführt. Um dies zu lösen, sollte der Future innerhalb des recover/recoverWith-Körpers definiert werden oder ein def anstelle von val sein. – roterl

+0

@roterl danke, du hast Recht, Futures werden gestartet, sobald sie deklariert sind. –

Verwandte Themen