Работа с несколькими 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