Скала будущего исполнения
У меня есть два будущего. Я хочу выполнить их по порядку. Например:
val ec: ExecutionContextExecutor = ExecutionContext.Implicits.global
val first=Future.successful(...)
val second=Future.successful(...)
Когда первый завершен, тогда второй должен быть выполнен. Проблема в том, что второй должен вернуться Future[Object]
не Future[Unit]
поэтому я не могу использовать законченный, andThen
и т.д. функции не могу заблокировать процесс используя await
или же Thread.sleep(...)
Я не могу использовать для цикла, так как контекст выполнения определяется следующим образом.
first.flatmap( _=> second)
не выполнится по порядку. Как я могу это сделать?
1 ответ
Как только вы назначите Future
Валь, что Future
запланировано и будет выполнено как можно скорее. Чтобы предотвратить это, у вас есть два варианта:
- Определите
Future
вdef
- Определите
Future
где вы хотите использовать это.
Вот пример № 1:
def first: Future[Int] = Future { Thread.sleep(5000); 1 }
def second(i: Int): Future[Unit] = Future { println(i) }
first.flatMap(i => second(i))
И вот пример № 2:
for(
i <- Future { Thread.sleep(5000); 1 };
_ <- Future { println(i) }
) yield ()
Оба примера будут ждать в течение 5 секунд и печатать затем 1