2015-06-05 15 views
10

The andThen co oznacza, że ​​dowiedziałem się z tego answer jest kompozytor funkcji.Dlaczego "The Future of the Future" nie wpływają na wynik?

Powiedzmy że

f andThen g andThen h 

wyniesie do

h(g(f(x))) 

Oznacza to, że h function otrzyma wejście od g(f(x))

Ale dla andThen w Future, wszystkie zamknięcia następnego andthen zawsze otrzymuje wynik z oryginalnego 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 
} 

porównać do

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) 

Jaki jest powód, aby Future :: andthen (s) otrzymywać wszystkie ten sam wynik z oryginalnym przyszłości zamiast łączenia przyszłości? Zauważyłem, że te łańcuchy i następnie zostaną wykonane sekwencyjnie, więc powodem może nie być równoległy cel.

Odpowiedz

14

scala.concurrent.Future jest zaprojektowana jako kompromis dwóch asynchronicznych metod:

  1. obiektowe observer który umożliwia wiązanie asynchronicznych koparki
  2. funkcjonalna monad która oferuje bogate możliwości funkcjonalne składu.

Reading Future.andThen's docs:

Stosuje funkcję bocznego wpływania na wynik tej przyszłości, a zwraca nową przyszłość z wynikiem tej przyszłości.

Tak więc andThen jest najprawdopodobniej ze świata OOP. Aby uzyskać podobny podobny wynik do Function1.andThen można użyć map metody:

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

andThen różni się od onComplete z jednej małej rzeczy: wynikający Przyszłość andThen wciąż powraca ten sam wynik, ale będzie czekać aż dostarczane obserwator zwróci albo rzucić coś. Dlatego w dokumentach znajduje się:

Ta metoda pozwala wymusić wykonanie wywołań zwrotnych w określonej kolejności.

pamiętać również trzecią linię z docs:

Zauważ, że jeśli jeden z przykuty callbacków andthen zgłasza wyjątek, że wyjątek nie jest propagowana do kolejnych wywołań zwrotnych andthen. Zamiast tego, kolejne wywołania zwrotne otrzymują oryginalną wartość tej przyszłości.

Tak więc "całkowicie nic nie robimy z nowym wynikiem Future". Nie mogłem nawet zepsuć tego z jego wyjątkiem. To andThen i tylko sekwencyjne i równoległe wiązanie obserwatorów.

+1

Czy mogę powiedzieć, że jest to kolejna wersja onComplete, ale zwraca "to", aby mogła powiązać wiele procedur obsługi wywołań zwrotnych "obserwatora" w stylu łączenia? –

+0

@ChenOT Tak. Niemal – Odomontois

+0

@But z jedną różnicą. Dodam to do asnwer – Odomontois