我想创建一个来自几个"询问"的结果列表。一系列的Akka演员。基本上我有一个期货清单,我想用这些结果填写清单,然后在所有期货都返回时执行下一个操作。
实施例: 我希望用
创建完成列表的对象类型case class Foo(id:Int, message:String)
期货清单来自:
val futures =
context.children.map {
child => {
(child ? ("foo"))(5 seconds)
}
}
如何使用futures
创建Foos列表?
val result = Await.result(futures.map(??????), 1 second).asInstanceOf[Foo]
答案 0 :(得分:5)
您可以使用Await.result
和Future.traverse
来完成此操作。
-- create one big Future containing all the responses
val future = Future.traverse(context.children) { c => (c ? "foo")(5 seconds) }
-- now wait for it to return
val result = Await.result(future, 1 second)
Future.traverse
是关键所在。略微简化,它需要Traversable[A]
作为它的第一个参数,而函数A => Future[B]
作为它的第二个参数,然后返回一个大的Future[Traversable[B]]
,这将完成所有个体Future
完成并包含函数的所有B
结果。
请注意,如果Future
的任何失败,合并的Future
也会失败,这可能是您想要的,也可能不是。
此外,通常建议不要使用Await
,因为它会在异步Actors
中引入顺序瓶颈,而是使用pipeTo
(或onComplete
等...)将Future
的结果作为消息发送到Actor
,然后相应地处理。