2015-06-05 10 views
10

Die andThen Bedeutung, die ich von dieser answer gelernt habe, ist eine Funktion Composer.Warum verkettet das andThen of Future nicht das Ergebnis?

Sagen Sie, dass

f andThen g andThen h 

zu

h(g(f(x))) 

gleich wird dies der h function Eingang erhalten impliziert von g(f(x))

Aber für die andThen in Future, alle die Schließung der folgenden andthen erhält immer das Ergebnis vom Original Future.

Future{ 
    1 
}.andThen{ case Success(x) => 
    println(x) // print 1 
    Thread.sleep(2000) 
    x * 2 
}.andThen{ case Success(x) => 
    println(x) // print 1 
    Thread.sleep(2000) 
    x * 2 
} 

vergleichen zu

val func: Function1[Int, Int] = { x: Int => 
    x 
}.andThen { y => 
    println(y) // print 1 
    y * 2 
}.andThen { z => 
    println(z) // print 2 
    z * 2 
} 
func(1) 

Was ist der Grund Zukunft zu machen :: andthen (n) von den ursprünglichen Zukunft all das gleiche Ergebnis erhält stattdessen Zukunft des Verkettungs? Ich habe beobachtet, dass diese verkettet und dann sequentiell ausgeführt werden, so dass der Grund nicht für parallele Zwecke sein kann.

Antwort

14

scala.concurrent.Future wird als Kompromiss von zwei asynchronen Ansätze entwickelt:

  1. Objektorientierte observer, die von asynchronen Handler
  2. Functional monad ermöglicht die Bindung, die Fähigkeiten reiche funktionelle Zusammensetzung bietet.

Lesen Future.andThen's docs:

Wendet die Neben Bewirkung Funktion auf das Ergebnis dieser Zukunft und gibt eine neue Zukunft mit dem Ergebnis dieser Zukunft.

So andThen ist höchstwahrscheinlich von OOP Universum. Gewinnen ähnliches ähnliches Ergebnis zu Function1.andThen Sie map Methode verwenden:

Future(1).map {_ * 2}.map {_ * 2} 

andThen von onComplete mit einer Kleinigkeit unterscheidet: resultierende Zukunft des andThen noch gleiches Ergebnis zurückkehrt, werden aber warten, bis gelieferte Beobachter zurückkehren werden oder etwas werfen. Deshalb gibt es in der Dokumentation geschrieben:

Diese Methode ein erzwingen ermöglicht, dass die Rückrufe in einer angegebenen Reihenfolge ausgeführt werden.

Beachten Sie auch, dritte Zeile von docs:

Beachten Sie, dass, wenn einer der verketteten andthen Rückrufe löst eine Ausnahme, diese Ausnahme nicht auf die nachfolgenden andthen Rückrufe ausbreitet. Stattdessen erhalten die nachfolgenden Callbacks andThen den ursprünglichen Wert dieser Zukunft.

Also es 'vollständig nichts mit neuen Future' s Ergebnis zu tun. Konnte es nicht einmal mit seiner eigenen Ausnahme verderben. Diese andThen und onComplete nur sequentielle und parallele Bindung von Beobachtern.

+1

Kann ich sagen, es ist eine andere Version von onComplete aber gibt "this" zurück, so dass es mehrere "Beobachter" Callback-Handler im Verkettungsstil binden kann? –

+0

@ChenOT Ja. So ziemlich – Odomontois

+0

@ Aber mit einem Unterschied. Ich füge das zu asnwer – Odomontois