2016-12-23 2 views
2

Hier ist ein Beispiel von scaladoc für andthen:Sinn macht dieses andthen Beispiel

val f = Future { 5 } 
f andThen { 
    case r => sys.error("runtime exception") 
} andThen { 
    case Failure(t) => println(t) 
    case Success(v) => println(v) 
} 

die Zeile nicht case r => sys.error("runtime exception") eine Ausnahme egal werfen, was die Zukunft endet zu sein? Macht für mich keinen Sinn, aber vielleicht habe ich etwas verpasst.

Antwort

3

Ja, es gibt eine Ausnahme, egal, was die Zukunft ausmacht.

Das Auslösen der Ausnahme könnte als eine Nachricht für den Thread dienen, für den die Ausnahme ausgelöst wird. Im Allgemeinen

,

andthen einige Neben zur Ausführung Bewirkung Code verwendet wird, nachdem die gegebene zukünftige abgeschlossen ist und der Ergebnistyp der Operation nach andthen wird das gleiche Ergebnis ursprünglichen Zukunft. Sie können also ein Muster erstellen und dasselbe Ergebnis wie in der ursprünglichen Zukunft erwarten.

In Ihrem Fall Seite bewirkt Betrieb eine Ausnahme wirft, aber es kann auch jeder anderer nützlicher Nebenbetrieb zu bewirken sein wie die Ressourcen zu schließen usw.

Hier Datei zu schreiben ist die Implementierung von andThen von Standardbibliothek Scala.

andThen wird verwendet, um einige Nebenwirkungsoperation auszuführen, sobald die Zukunft, auf der sie aufgerufen wird, abgeschlossen ist, aber die zu beachtende Sache ist der Ergebnistyp der gesamten Operation wird die Zukunft mit ursprünglichem zukünftigem Ergebnis sein.

def andThen[U](pf: PartialFunction[Try[T], U])(implicit executor: ExecutionContext): Future[T] = { 
    val p = Promise[T]() 
    onComplete { 
     case r => try pf.applyOrElse[Try[T], Any](r, Predef.conforms[Try[T]]) finally p complete r 
    } 
    p.future 
    } 

Hinweis nach der andThen Betrieb Zukunft mit dem Ergebnis der ursprünglichen Zukunft zurückgegeben.

Wie von @ Yuval Itzchakov gesagt, könnten Sie es verwenden, um die Ausnahmen auf den Hauptthread zu werfen. Aber im Allgemeinen wird es für die Nebenwirkung nach dem Abschluss einer Zukunft verwendet.

1

die Zeile nicht case r => sys.error("runtime exception") eine Ausnahme werfen, egal was die Zukunft zu sein endet?

Ja, tut es. Aber eine Sache, die Sie beachten müssen, dass Ausnahmen, die innerhalb eines Future geworfen werden, nicht automatisch auf den Hauptausführungsthread erneut geworfen werden, müssen sie gehandhabt werden und vom Hauptthread für das Programm beendet werden, um zu beenden.

Alle andThen können Sie tun, ist einige Nebeneffekt-Methode in der Reihenfolge ausführen und weiter auf die Zusammensetzung der Futures. Es gibt willkürlich viele Dinge, die Aufmerksamkeit erfordern, wie zum Beispiel offene Ressourcen. Wenn Sie nur die Futures erstellen möchten, würde ich stattdessen mit Future.map gehen.