【发布时间】:2014-04-11 08:23:58
【问题描述】:
我有一个演员接收消息并运行两个期货。这些期货可以并行运行,所以我想我可以使用 for 理解来运行这两个期货并将它们的结果组合成一个对发件人的响应。我可以自己获取每个结果,但是当它们都完成时,我不知道该怎么做才能聚合它们。
def receive = {
case "pcbStatus" => {
val currentSender = sender
//first future
val wsf = (self ? "workhorseStats")(5 seconds)
val psf = Future.traverse(context.children)(x => {
(x ? "reportStatus")(5 seconds)
});
val combined = for {
r1 <- wsf
r2 <- psf
} yield (r1, r2)
combined.onComplete {
case Success(result:Any) => {
val response = new SomeCaseClass(r1,r2)
println("YAY: " + response)
currentSender ! response
}
case Failure(failure) => {
println("FAIL: " + failure)
}
}
}
}
【问题讨论】:
-
但是你已经得到了一个 Future[(Int,Int)] (或者你的 wsf 和 psf 的任何类型),并且在 onComplete 中展开它,那么问题是什么?
-
我想获取结果(r1 和 r2)并用它们创建响应...更新代码以反映
-
你写
new SomeCaseClass(r1, r2)的地方,r1和r2都不在范围内。但是,您可以匹配case Success((r1, r2)) =>并跳过讨厌的Any业务。 -
@RandallSchulz 超时了,还有其他想法吗?
-
您是
askingself,但您的 Actor 没有任何情况可以回复"workhorseStats"。等待时间自然会超时。