Метод, возвращающий Future [Unit], содержащий вложенное будущее, которое, как ожидается, завершится - PullRequest
0 голосов
/ 14 мая 2018

С помощью этого метода

def taskA(): Future[Unit] = Future {
Future {
  print("Starting nested future")
  Thread.sleep(3000)
  print("Finished nested future")
} 
print("starting outer future")
Thread.sleep(1000)
print("finished outer future")
}

Можно ли ждать завершения вложенного будущего, прежде чем фактически завершить внешнее будущее?Вот как я выполняю эту программу:

print("Starting program")
val futureA = taskA()

futureA onComplete{
case Success(_) => print("future suceeded")
case Failure(_) => print("not able to execute future")
}

Await.result(futureA, Duration.Inf)

Это вывод моей консоли:

15:18:52.357 [main] Starting program
15:18:52.563 [scala-execution-context-global-13] Starting nested future
15:18:52.564 [scala-execution-context-global-12] starting outer future
15:18:53.564 [scala-execution-context-global-12] finished outer future
15:18:53.566 [scala-execution-context-global-12] future suceeded

Process finished with exit code 0

1 Ответ

0 голосов
/ 14 мая 2018

Если вы хотите выполнить something , а затем do somethingElse, то вы выполняете две операции последовательно, где вторая операция должна ждать до завершения первой операции.Для практических целей это именно то, что делает monadic flatMap .Итак, вам лучше сделать что-то вроде этого:

def taskA(): Future[Unit] = for {
  _ <- Future {
    print("Starting first future")
    Thread.sleep(3000)
    print("Finished first future")
  };
  _ <- Future {
    print("starting outer future")
    Thread.sleep(1000)
    print("finished outer future")
  }
} yield ()

Первое _ <- ... обеспечит завершение первого будущего до запуска второго будущего.

...