Скала будущего исполнения

У меня есть два будущего. Я хочу выполнить их по порядку. Например:

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 запланировано и будет выполнено как можно скорее. Чтобы предотвратить это, у вас есть два варианта:

  1. Определите Future в def
  2. Определите 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

Другие вопросы по тегам