2016-05-31 6 views
2

Ich bin derzeit ein bisschen mit der Logik der Zukunft Rückrufe in scala. Ich versuche, eine Methode zu erhalten, die Folgendes tun soll:Futures und Callbacks für die Änderung von Wert auf Variable

  1. schließt mit dem Wert x, wenn x mit dem Wert y erfolgreich
  2. schließt vervollständigt, wenn x ausfällt und schließlich
  3. schließt mit der Ausnahme, dass nicht y wenn x und y fehlschlägt.

Hier ist mein Code, die aus irgendeinem Grund nicht funktioniert:

def eitherF(x: Future[Int], y: Future[Int]): Future[Int] = { 
    var ret : Future[Int] = x 
    ret onComplete { 
    case Success(i) => 
    case Failure(t) => ret = ret.flatMap(e => y) 
    } 
    ret 
} 

Wenn ret zurückgegeben wird es immer den Wert von x hat, es ist wie der onComplete Block vollständig ignoriert. Wie kann ich den Wert von ret abhängig von dem Ergebnis von x und y ändern?

+0

Haben Sie die Ausnahme zurückkehren möchten oder die Ausnahme werfen? –

+0

In Fall 3 möchte ich den gleichen Future y zurückgeben, der die Ausnahme verursacht hat. –

Antwort

2

Sie können eine Kombination von Future.fallbackTo und Future.recoverWith verwenden:

def eitherF(x: Future[Int], y: Future[Int]): Future[Int] = { 
    x.recoverWith { 
    case _: Exception => y 
    } 
} 
+0

Ich löste das Problem mit: 'ret.recoverWith ({Fall e: ArithmeticException => y})' seit die Ausnahme in dieser umfassenden Anwendung geworfen würde immer von diesem Typ sein. Danke für die Hilfe! –

+1

@Yuval Ich bin mir nicht sicher, ob 'fallbackTo (y)' hier überhaupt benötigt wird – slouc

+1

@slouc Du hast recht. 'recoverWith' kümmert sich um den Fallback. –