2016-04-23 46 views
8

我想知道當我們在Scala中使用Future時,onComplete和foreach之間的區別。onComplete和foreach在Scala中的未來有什麼區別?

f onComplete (_ => doSomething(_))

f foreach (_ => doSomething(_))

  1. 執行的代碼導致上述線路相同的結果?

  2. 如果我想在完成之後做一些與未來f的事情。我該怎麼辦?我應該使用isCompleted這樣的:

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

謝謝你們了很多

回答

13

的主要區別是,即使將來有失敗完成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找出你將如何受到變化的影響

+0

謝謝你,你的回答非常詳細。我從中學到了很多東西。所以,這意味着'foreach'相當於'onSuccess'。是對的嗎? – hminle

+1

'foreach'是'onSuccess'的「全部」版本。如果你將一個全部函數傳遞給'onSuccess',它們實際上是等價的。 'foreach'和'onSuccess'都是通過'onComplete'實現的,但是這會改變2.12 –

+0

謝謝:),我明白了 – hminle

相關問題