从Scala中的Future结果创建一个List

时间:2014-04-04 16:05:36

标签: scala akka future

我想创建一个来自几个"询问"的结果列表。一系列的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]

1 个答案:

答案 0 :(得分:5)

您可以使用Await.resultFuture.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,然后相应地处理。