【问题标题】:Futures and callbacks for changing value to variable将值更改为变量的期货和回调
【发布时间】:2016-09-29 10:47:40
【问题描述】:

我目前正在为 scala 中的 Future 回调逻辑而苦苦挣扎。 我正在尝试获得一种应该执行以下操作的方法:

  1. 如果 x 成功完成,则以值 x 完成
  2. 如果 x 失败并最终以值 y 完成
  3. 如果 x 和 y 失败,则完成,但 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 的值?

【问题讨论】:

  • 是返回异常还是抛出异常?
  • 在案例 3 中,我想返回导致异常的同一个 Future y。

标签: scala callback future


【解决方案1】:

您可以使用Future.fallbackToFuture.recoverWith 的组合:

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

【讨论】:

  • 我解决了这个问题:ret.recoverWith({ case e: ArithmeticException => y }),因为在这个特定应用程序中抛出的异常总是属于那种类型。感谢您的帮助!
  • @Yuval 我不确定这里是否需要fallbackTo(y)
  • @slouc 你是对的。 recoverWith 将负责回退。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多