的主要區別是,即使將來有失敗完成onComplete
回調函數被調用,而foreach
(和onSuccess
)功能僅在成功結果的情況下被調用。
事實上,onComplete
的參數是一個函數Try[T] => U
:您通過功能將與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
s,實際上這正是它在標準庫中的實現方式。
def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit
onSuccess
參數是,對稱onFailure
,一個PartialFunction
即如果將來成功完成並且提供PartialFunction
針對值限定在僅implicit executor
執行。
def foreach[U](f: T => U)(implicit executor: ExecutionContext): Unit
foreach
是基本相同onSuccess
但它需要一個總的功能。這意味着,如果未來成功完成f
始終執行
N.B: 「的onSuccess」和「onFailure處」會在2.12中被取消。我建議你閱讀this series of posts by Viktor Klang找出你將如何受到變化的影響
謝謝你,你的回答非常詳細。我從中學到了很多東西。所以,這意味着'foreach'相當於'onSuccess'。是對的嗎? – hminle
'foreach'是'onSuccess'的「全部」版本。如果你將一個全部函數傳遞給'onSuccess',它們實際上是等價的。 'foreach'和'onSuccess'都是通過'onComplete'實現的,但是這會改變2.12 –
謝謝:),我明白了 – hminle