我是Scala的新手,正在使用Akka和Futures开发应用程序
我有一个处理未来的并返回对象类型X的List(L)的类(C)。X有一个字段y,并且它是我插入的该字段。(注意:L先前是从a转换而来的ListBuffer类型)。
在调用C的Main Class中,用于处理结果的代码为:
代码段A:
result1.onComplete {
result =>
result.foreach(f = (o: List[X]) => {
o.foreach(f = (o: x) => {
println(X.y)
})
})
}
我也可以使用以下代码:
摘要B:
result1 onSuccess{
case result =>
result.foreach(f = (o: X) => {
println(o.y)
})
}
显然,由于不赞成使用OnSuccess,因此首选第一种形式。我可以理解第二种形式(代码片段B),但对于为什么在使用onComplete时必须使用嵌套的“ foreach”来获得相同的结果感到困惑。如果有人可以提供帮助,因为我还没有明确的“结果”概念(Try [T] => U)?实际上是。预先感谢..:)
答案 0 :(得分:2)
如果您查看Future.onComplete
scaladoc,您会发现它接收到来自Try[T]
的函数(其中T是类型),直到Unit
。
“完成此将来时,可以通过异常或值来应用提供的功能。”
“请注意,返回的f值将被丢弃”。
尝试可以在异步计算上捕获故障-这就是为什么您需要两个foreach
的原因,第一个一种是从Successful
中提取Try
列表,第二种是从 List 中提取每个元素O
。
对于onSuccess
,您不需要两个,因为顾名思义,只有 Future 成功完成后,才会调用回调。
但是,请注意,在foreach
上执行Try
是一个坏主意,因为您无法处理故障,因此代码也变得难以阅读-尝试这样做。
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}
case class Result(data: Int)
val process: Future[List[Result]] =
Future.successful(List(Result(data = 5), Result(data = 3)))
process.onComplete {
case Success(results) =>
for (result <- results) {
println(result.data)
}
case Failure(ex) =>
println(s"Error: ${ex.getMessage}")
}