2017-08-10 3 views
2

Ich habe eine für das Verständnis von Futures, die alle Remote-Service-Anrufe (REST, RPC, etc ...). Wenn eine dieser Zukunft versagt, wird das Ganze zum Verständnis versagen?Ignorieren fehlgeschlagene Zukunft in Verständnis

Zum Beispiel lassen Sie uns sagen, dass ich zwei Futures haben die Service-Anrufe

val service1Future: Future[Response] = ... 
val service2Future: Future[Response] = ... 

Sagen wir service2Future auch einige recoverWith hat die PartialFunction[Throwable, Future[U]] eine Ausnahme auslöst.

Wenn service2Future ausfällt, ist mir nicht wirklich egal. Kann ich das zum Verständnis durchsetzen?

for { 
    service1Response <- service1Future 
    service2Response <- service2Future 
} yield { 
    // do stuff with service1Response, but I want to get here even if service2Future fails 
} 
+0

Die Verwendung für Verständnis oder FlatMap macht in diesem Fall keinen Sinn. – cchantep

Antwort

1

Ja, das gesamte Verständnis wird fehlschlagen, wenn die zweite Zukunft wie geschrieben fehlschlägt. Würde so etwas so einfach funktionieren?

for { 
    service1Response <- service1Future 
    service2Response <- service2Future.recoverWith(...) 
} yield { 
    ... 
} 
+0

Ist dies notwendig, wenn 'def getService2: Future [Ergebnis] = { ... code ... someFutureCall.recoverWith (...) }' (d. H. Die Methode, die service2Future zurückgibt, hat bereits eine recoverWith innerhalb)? – Confused

+0

Wenn es bereits ein 'recoverWith' hat und die an 'recoverWith' übergebene Funktion nicht fehlschlagen kann, dann ist dies nicht notwendig und das grundlegende Verständnis für Ihre erste Antwort wird gut funktionieren. –

0

Eine Möglichkeit wäre Future[Try[Response]] statt Future[Response] zurückzukehren. In recoverWith würden Sie Future(Failure(e)) zurückgeben. Sie können dann Muster in der yield vergleichen, um zu sehen, ob es erfolgreich war oder nicht.

Verwandte Themen