2016-05-31 26 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'将负责回退。 –