В Scala я могу использовать Await
, чтобы дождаться, когда будет завершено будущее. Однако, если я зарегистрировал обратный вызов для запуска по завершении этого будущего, как я могу ждать не только для будущего завершения, но и для завершения этого обратного вызова?
Вот минимальная, но полная программа, иллюстрирующая проблему:
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)
}
}
Я ожидаю, что вывод будет:
The program waited patiently for this callback to finish.
Вместо этого нет выхода; программа завершает работу до завершения обратного вызова.
Обратите внимание, что это не та же проблема, что и в ожидании будущего завершения, на который ранее был дан ответ на этот вопрос.