scala中未来的onComplete和foreach有什么区别?

时间:2016-04-23 07:13:26

标签: scala foreach concurrency future

我想知道在Scala中使用Future时onComplete和foreach之间的区别。

f onComplete (_ => doSomething(_))

f foreach (_ => doSomething(_))

  1. 上述代码行是否会产生相同的结果?

  2. 如果我想在完成之后再做一些未来的事情。我该怎么办?我应该像这样使用isCompleted:

    if(f.isCompleted) f onComplete (_ => doSomething(_))

  3. 非常感谢你们

1 个答案:

答案 0 :(得分:17)

主要区别在于即使将来以失败完成调用onComplete回调,而foreach(和onSuccess)函数仅被调用如果成功结果。

实际上,onComplete的参数是一个函数Try[T] => U:如果未来成功或{{1},您传递的函数将以Success[T]作为参数调用如果有例外:

Failure

此外,您无需检查任何内容即可调用上述方法:val f = Future { ??? } // this future completes with a failure // foreach only calls the callback if the future is successful f.foreach(_ => thisWillNeverExecute()) // This will print "future failed" after the future completes f.onComplete { case Success(_) => println("future completed successfully") case Failure(e) => println("future failed") } / onComplete / onSuccess / onFailure所有人都会安排调用的回调只有在未来完成时,您在范围内的隐式foreach

即使ExecutionContext为假,您也可以调用它们,只有在未来成功完成或失败时才会执行它们,具体取决于您选择的是哪一个。

让我们来看看他们的签名:

isCompleted
  • def onComplete[U](@f: Try[T] => U)(implicit executor: ExecutionContext): Unit 采用onComplete函数:当将来完成时,此函数将在Try[T] => U上执行。如果未来成功,参数将为implicit executor,如果未来失败,则为Success[T]
Failure
  • def onFailure[U](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Unit 参数是onFailure,只有在PartialFunction未来失败且implicit executor已定义Throwable时才会在pf上执行。它与调用onComplete仅匹配一些Failure基本相同,实际上这正是它在标准库中的实现方式。
def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit
  • onSuccess参数与onFailure对称,PartialFunction仅在implicit executor上执行,如果未来成功完成且提供的PartialFunction为为价值定义。
def foreach[U](f: T => U)(implicit executor: ExecutionContext): Unit
  • foreachonSuccess基本相同,但它需要一个完整的功能。这意味着如果Future成功完成,则始终执行f

N.B .: 'onSuccess'和'onFailure'将在2.12中弃用。我建议你阅读this series of posts by Viktor Klang,了解你将如何受到这些变化的影响