理解这个和那个例子

时间:2016-12-23 09:37:03

标签: scala future

这是scaladoc for andThen的一个例子:

val f = Future { 5 }
f andThen {
  case r => sys.error("runtime exception")
} andThen {
  case Failure(t) => println(t)
  case Success(v) => println(v)
}

无论未来最终是什么,行case r => sys.error("runtime exception")都不会抛出异常?对我来说真的没有任何意义,但也许我错过了什么。

2 个答案:

答案 0 :(得分:3)

是的,无论未来到底是什么,它都会引发异常。

抛出异常可以作为抛出异常的线程的消息。

一般来说,

然后用于在给定的未来完成之后执行一些副作用代码,并且之后的操作的结果类型是和原始未来相同的结果。因此,您可以模式匹配并期望与原始未来相同的结果。

在你的情况下,副作用操作是抛出异常,但它可以是任何其他有用的副作用操作,如写入文件,关闭资源等

以下是标准Scala库中andThen的实现。

andThen用于在调用它的未来完成后运行一些副作用操作,但需要注意的是整个操作的结果类型将是未来原始未来结果。< / p>

 def andThen[U](pf: PartialFunction[Try[T], U])(implicit executor: ExecutionContext): Future[T] = {
    val p = Promise[T]()
    onComplete {
      case r => try pf.applyOrElse[Try[T], Any](r, Predef.conforms[Try[T]]) finally p complete r
    }
    p.future
  }

注意andThen操作后,将返回原始未来的结果。

正如@Yuval Itzchakov所说,您可以使用它将异常抛给主线程。但通常它会在未来完成后用于副作用。

答案 1 :(得分:1)

  

线case r => sys.error("runtime exception")不会抛出   无论未来最终是什么,例外?

是的,确实如此。但有一件事你需要记住,在Future内抛出的异常不会在主执行线程上自动重新抛出,它们需要从主线程处理和重新抛出,以便程序终止。 / p>

所有andThen允许你做的是按顺序执行一些副作用方法,并继续构成期货。有许多事情可能需要引起注意,例如处理开放资源。如果你想要的只是组成期货,我会选择Future.map