【发布时间】:2014-12-02 08:50:02
【问题描述】:
我正在使用未来创建三个演员任务,然后在完成后尝试收集所有三个。 当前代码如下:
implicit val timeout = Timeout(5.seconds)
val result1 = actor1 ? DataForActor(data)
val result2 = actor2 ? DataForActor(data)
val result3 = actor3 ? DataForActor(data)
val answer = for {
a <- result1.mapTo[List[ResultData]]
b <- result2.mapTo[List[ResultData]]
c <- result3.mapTo[List[ResultData]]
} yield (a ++ b ++ c).sorted
answer onComplete {
case Success(resultData) =>
log.debug("All actors completed succesffully")
successActor ! SuccessData(resultData.take(2))
case Failure(resultData) =>
log.info("actors failed")
}
每个参与者(actor1、actor2、actor3)操作数据并返回 None 或 Option(List(resultData)),如下代码所示:
val resultData = if(data.size == 0) None else {
data.map {
...
try {
... //manipulation on resultData
Option(resultData)
}
catch {
case e: Exception => None
}
}.flatten
}
for 语句连接来自每个参与者的列表,并生成一个长 List(resultData)。
我希望在一个参与者返回 None 的情况下,它的结果是 for 语句不会向连接添加任何内容,即 List()。
一个例子:
如果我得到: 结果 1 = 列表 (1, 2, 3), 结果 2 = 无, 结果3 = 列表(4, 5),
我想要: resultData = List(1, 2, 3, 4, 5)
【问题讨论】:
-
在任何情况下都尝试返回相同的类型。您应该返回
Nil而不是None或使用Option[List[ResultData]]。