鉴于此代码
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)