In Scala, I can use Await
to wait for a future to complete. However, if I have registered a callback to run upon completion of that future, how can I wait not only for the future to complete but also for that callback to finish?
Here is a minimal but complete program to illustrate the problem:
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)
}
}
I expect the output to be:
The program waited patiently for this callback to finish.
Instead, there is no output; the program exits before the callback finishes.
Please note that this is not the same problem as waiting for a future to complete, which has been answered previously at this question.