我有一个列表的东西,让我们只是说字符串。
我想将它转换成事物的Future [List],让我们再来说一下Strings。
并行执行是不是通缉。Scala/Play:从(部分)列表中创建未来[列表[...]]
这将最终在一个Action.async,所以不欢迎阻止。
我有一个处理程序可能会在未来转换一个元素。
简体到这一点:
def handle(input: String): Future[ String ] =
{
input match {
case "X" => Future.failed(new Exception("failed on "+input))
case other => Future.successful("handled "+other)
}
}
在我想回到一个未来到底[列表[...],包括第一个失败的结果,然后停止。
可以简化为这样:
def handleInOrder(inputs: List[ String ]): Future[ List[ String ] ] = {
val output = new ListBuffer[ String ]()
breakable { for(input <- inputs){
Await.ready(handle(input), Duration.Inf).value.get match {
case Success(result) => output += result;
case Failure(reason) => output += "Ex:"+reason; break
}
} }
Future.successful(output.toList)
}
,一切事都处理的顺序很重要。
这样工作,但我真的想摆脱“Await.ready”。
我希望我的问题很清楚,目前我无法将我的头围绕在此。
的
handleInOrder(List("a", "b", "X", "c")
调用应该返回
List(handled a, handled b, Ex:java.lang.Exception: failed on X)
这是非常接近的,但其实我是想的处理第一次失败后停止。 (虽然仍然提供达到这一点的结果!) – Andreas 2014-10-10 15:25:08