使用多个Scala期货

时间:2014-07-17 21:04:56

标签: scala akka future async-await

我不止一个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 个答案:

答案 0 :(得分:3)

Future.sequenceforeach

一起使用
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的函数中进行进一步处理。

答案 1 :(得分:0)

你可以使用for-comprehension。

val actors: Future[(ActorRef, ActorRef)] = for {
  a <- createActorA()
  b <- createActorB()
} yield (a -> b)
// Await on actors