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

bin*_*ant 2 scala future akka

我想创建一个从几个"问"到一系列Akka演员的结果列表.基本上我有一个期货清单,我想用这些结果填写清单,然后在所有期货都返回时执行下一个操作.

示例:我期望使用创建完成列表的对象类型

case class Foo(id:Int, message:String)
Run Code Online (Sandbox Code Playgroud)

期货清单来自:

val futures =
        context.children.map {
          child => {
            (child ? ("foo"))(5 seconds)
          }
        }
Run Code Online (Sandbox Code Playgroud)

如何futures创建Foos列表?

val result = Await.result(futures.map(??????), 1 second).asInstanceOf[Foo]
Run Code Online (Sandbox Code Playgroud)

cdk*_*cdk 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)
Run Code Online (Sandbox Code Playgroud)

Future.traverse关键在这里.稍微简化一下,它需要Traversable[A]第一个参数和一个函数,A => Future[B]因为它是第二个,然后返回一个大的Future[Traversable[B]],一旦所有个体Future完成并包含B函数的所有结果就会完成.

请注意,如果任何一个Future失败,合并Future也会失败,这可能是你想要的,也可能不是.

此外,通常建议不要使用Await它,因为它会在异步中引入顺序瓶颈Actors,而是使用pipeTo(或onComplete等...)将Future消息的结果发送给您Actor,然后相应地处理它.