我想知道在Scala中使用Future时onComplete和foreach之间的区别。
f onComplete (_ => doSomething(_))
和
f foreach (_ => doSomething(_))
上述代码行是否会产生相同的结果?
如果我想在完成之后再做一些未来的事情。我该怎么办?我应该像这样使用isCompleted:
if(f.isCompleted) f onComplete (_ => doSomething(_))
非常感谢你们
答案 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
foreach
与onSuccess
基本相同,但它需要一个完整的功能。这意味着如果Future成功完成,则始终执行f
N.B .: 'onSuccess'和'onFailure'将在2.12中弃用。我建议你阅读this series of posts by Viktor Klang,了解你将如何受到这些变化的影响