In Scala kann ich Await
verwenden, um auf eine Zukunft zu warten, um abzuschließen. Wenn ich jedoch nach Abschluss dieser Zukunft einen Rückruf registriert habe, wie kann ich dann nicht nur auf die Fertigstellung der Zukunft warten, sondern auch darauf, dass dieser Rückruf beendet wird?Wie warte ich darauf, dass ein onSuccess-Rückruf von Scala future abgeschlossen wird?
Hier ist ein minimal, aber vollständiges Programm, das Problem zu veranschaulichen:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{ Await, Future }
object Main {
def main(args: Array[String]): Unit = {
val f: Future[Int] = Future(0)
f.onSuccess { case _ =>
Thread.sleep(10000)
println("The program waited patiently for this callback to finish.")
}
// This waits for `f` to complete but doesn't wait for the callback
// to finish running.
Await.ready(f, Duration.Inf)
}
}
erwarte ich, dass der Ausgang sein:
The program waited patiently for this callback to finish.
Stattdessen gibt es keine Ausgabe; Das Programm wird beendet, bevor der Rückruf abgeschlossen ist.
Bitte beachten Sie, dass dies nicht das gleiche Problem ist wie das Warten auf eine Zukunft, die zuvor unter this question beantwortet wurde.
Es gibt keinen Punkt 2 Futures zu machen ist, wenn Sie werfen werden weg den Wert des ersten. Könnte auch einfach alles in einer einzigen Zukunft laufen lassen. –
Dies sollte so nah wie möglich an dem angegebenen Code bleiben. In einer realen Anwendung würde die erste Zukunft einen Wert erzeugen, den Sie tatsächlich verwenden. –
Wenn 'map' und' flatMap' dieselben Funktionen wie 'onSuccess' (und mehr, da sie Werte zurückgeben können) ausführen, warum sollte der 'onSuccess' in der API überhaupt sein? Ist es nur für die Symmetrie mit "onFailure"? Oder sind 'onSuccess' und' onFailure' untergeordnete Konstrukte, auf denen 'map' und' flatMap' unter der Haube implementiert sind? –