Warum tut das dann der Zukunft nicht Kette das Ergebnis?
Den andThen
Bedeutung, die ich gelernt, aus dieser Antwort ist eine Funktion Komponist.
Sagen, dass
f andThen g andThen h
wird gleich
h(g(f(x)))
Dies impliziert die h function
erhalten input von g(f(x))
Aber für die andThen
im Future
alle die Schließung der folgenden dann erhält immer das Ergebnis von der ursprünglichen 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, um
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 der Zukunft::dann(s), alle erhalten das gleiche Ergebnis von der ursprünglichen Zukunft anstelle der Verkettung Zukunft? Ich habe festgestellt, dass diese verkettete dann sequentiell abgearbeitet werden, so kann der Grund nicht sein für parallel Zweck.
Du musst angemeldet sein, um einen Kommentar abzugeben.
scala.concurrent.Future
ist konzipiert als Kompromiss zweier asynchroner Ansätze:Lesen
Zukunft.dann
's docs:So
andThen
ist wahrscheinlich aus OOP-Universum. Zu gewinnen ähnlichen ähnliches Ergebnis zuFunction1.andThen
könnten Sie S)(implicitexecutor:scala.gleichzeitige.ExecutionContext):scala.gleichzeitige.Zukunft[S]" >map
Methode :andThen
unterscheidet sich vononComplete
mit einer Kleinigkeit: die daraus resultierende Zukunft derandThen
noch zurückgeben gleiche Ergebnis, aber warten, bis geliefert Beobachter zurück oder werfen etwas. Das ist, warum es geschrieben steht in den docs:Beachten Sie auch die Dritte Zeile von docs:
Damit es " komplett nichts zu tun mit neuen
Future
's Ergebnis. Konnte ja nicht verderben, es mit es ownt Ausnahme. DieseandThen
undonComplete
nur sequenzielle und parallele Bindung von Beobachtern.Lassen Sie mich zusammenfassen diese nette Diskussion.
Sagen, wir haben
tf: Future[T] =...
, und zwei Funktionen,f: T => U
undg: U => V
Können wir tun
vf: Future[V] = tf map f map g
, wievf: Future[V] = tf map (f andThen g)
In einem anderen use-case, dass
fp: PartialFunction[T, U]
undgp: PartialFunction[U, V]
,können wir
tf1: Future[T] = tf andThen fp andThen gp
- diese partiellen Funktionen aufgerufen werden, auf dem Wert, der tf produziert, mit außerhalb keine Wirkung, nur Nebenwirkungen passieren. Diese Sequenz wartetfp
vor dem Aufrufgp
.Eine weitere operation, onComplete, funktioniert wie folgt: nachdem
f: Try[T] => U
, wird der Anruftf onComplete f
rufenf
auch wenn die Zukunft endete mit einer Fehlermeldung, das Ergebnistf onComplete f
ist der TypUnit
.Auch, wenn Ihre Funktion
f
produziert eineFuture
, müssen SieflatMap
.