Scala Future.fallbackTo有什么用?

rob*_*r78 11 scala future

鉴于此代码

val f1: Future[Int] = Future { 5 } //Future.failed(new Exception("sorry"))
val f2: Future[Int] = Future { 6 }

val result : Future[Int] = f1.fallbackTo {
  println("Fall back to that F")
  f2
}
Run Code Online (Sandbox Code Playgroud)

结果包含f1的结果.但是,无论f1是否失败,都会执行fallbackTo块中的代码.我期待只有在f1失败时才会执行fallbackTo块.

也许我的例子太简单(或者只是错误),但是fallbackTo的用途是什么?

End*_*Neu 24

你是正确的,f1如果成功则返回,如果没有f2,你看到的打印是因为块没有被懒惰地评估:

def fallbackTo[U >: T](that: Future[U]): Future[U]
Run Code Online (Sandbox Code Playgroud)

所以它似乎f2是在传递给它时启动的fallbackTo(因此执行了print语句).可能它是一个设计选择,如果它会被懒惰评估f2,只有在失败之后才会开始f1.

如果您想避免这种行为,您可以使用recoverWith仅在失败后触发的行为:

f1.recoverWith{ case _ => println(123); Future { 6 } }
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,f2与f1并行运行.要解决这个问题,Future应该在recover/recoverWith体内定义,或者是def而不是val (2认同)