W Scali mogę użyć Await
, aby poczekać na ukończenie przyszłości. Jeśli jednak zarejestrowałem wywołanie zwrotne, które będzie uruchamiane po zakończeniu tej przyszłości, jak mogę czekać nie tylko na zakończenie tej usługi, ale także na zakończenie tego połączenia zwrotnego?Jak mogę czekać na zakończenie wywołania zwrotnego onSuccess w Scala?
Tutaj jest minimalny, ale kompletny program do zilustrowania problemu:
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)
}
}
Spodziewam się, że wyjście będzie:
The program waited patiently for this callback to finish.
Zamiast tego, nie ma wyjścia; program kończy działanie przed zakończeniem oddzwaniania.
Należy pamiętać, że nie jest to ten sam problem, co oczekiwanie na ułożenie w przyszłości, na co wcześniej udzielono odpowiedzi pod numerem this question.
Nie ma sensu w podejmowaniu 2 futures jeśli rzucanie od wartości pierwszego. Równie dobrze można uruchomić wszystko w jednej przyszłości. –
To miało pozostać jak najbliżej podanego kodu. W prawdziwej aplikacji pierwsza przyszłość wytworzyłaby wartość, której faktycznie używasz. –
Jeśli 'map' i' flatMap' dokonują tych samych rzeczy co 'onSuccess' (i więcej, ponieważ mogą zwracać wartości), dlaczego w ogóle ma on' onSuccess' w API? Czy jest to tylko dla symetrii z 'onFailure'? Lub są konstrukcje niższego poziomu 'onSuccess' i' onFailure', w których 'map' i' flatMap' są implementowane pod maską? –