2016-05-31 32 views
2

我目前正在努力與scala未來回調的邏輯。 我試圖讓這應該做的方法如下:將期權和回調變爲價值變量

  1. 與x值完成對如果x與失敗的異常成功完成
  2. 完成與值y如​​果x失敗,終於
  3. 完成對y如果x和y失敗。

這裏是我的代碼,因爲某些原因無法正常工作:

def eitherF(x: Future[Int], y: Future[Int]): Future[Int] = { 
    var ret : Future[Int] = x 
    ret onComplete { 
    case Success(i) => 
    case Failure(t) => ret = ret.flatMap(e => y) 
    } 
    ret 
} 

當RET返回它總是有x的值,它就像塊的onComplete被完全忽略。 如何根據從x和y得到的結果修改ret的值?

+0

是否要返回異常或拋出異常? –

+0

在案例3中,我想返回導致異常的相同Future。 –

回答

2

您可以使用Future.fallbackToFuture.recoverWith組合:

def eitherF(x: Future[Int], y: Future[Int]): Future[Int] = { 
    x.recoverWith { 
    case _: Exception => y 
    } 
} 
+0

我解決了這個問題: 'ret.recoverWith({case e:ArithmeticException => y})' 因爲在這個特定應用程序中拋出的異常總是屬於那種類型。 感謝您的幫助! –

+1

@Yuval我不確定'fallbackTo(y)'是否需要在這裏 – slouc

+1

@slouc你說得對。 'recoverWith'將負責回退。 –