Работа с несколькими Scala Futures

У меня больше одного Future,

val actor1 : Future[ActorRef] = createActorA()
val actor2 : Future[ActorRef] = createActorB() 
...
...
...

Теперь мне нужно извлечь ActorRefиз всех этих фьючерсов, чтобы я мог использовать их для создания Router,

val routees = Vector[ActorRef](actor1, actor2, .....)
val router = system.actorOf(Props.empty.withRouter(
  RoundRobinRouter(routees = routees)))

я могу позвонить Await на каждом из них Futureс, чтобы получить ActorRef, Есть ли лучший способ?

2 ответа

Решение

Использование Future.sequence с foreach:

Future.sequence(Vector(
  createActorA(),
  createActorB() // and so on
)) foreach { routees =>
  val router = system.actorOf(Props.empty.withRouter(
    RoundRobinRouter(routees = routees)))
  // do something with router
}

Future.sequence берет коллекцию фьючерсов и возвращает будущее, содержащее коллекцию с результатом этих фьючерсов, в этом случае она возвращает Future[Vector[ActorRef]], Затем мы вызываем foreach на это будущее, чтобы прикрепить обработчик к завершению этого будущего. Это дает нам доступ к коллекции (routees) и мы создадим нужный роутер. Мы можем продолжить дальнейшую обработку в функции, переданной в foreach.

Вы можете использовать для понимания.

val actors: Future[(ActorRef, ActorRef)] = for {
  a <- createActorA()
  b <- createActorB()
} yield (a -> b)
// Await on actors
Другие вопросы по тегам