Scala Future到底返回了什么?

时间:2018-11-25 14:15:09

标签: scala

我是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)?实际上是。预先感谢..:)

1 个答案:

答案 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}")
}