鉴于此代码
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
}
结果包含f1的结果。但是,无论f1是否失败,都会执行fallbackTo块中的代码。我期待只有在f1失败时才会执行fallbackTo块。
也许我的例子太简单(或者只是错误),但是fallbackTo的用途是什么?
答案 0 :(得分:21)
你是对的,f1
如果成功则返回f2
,如果不是def fallbackTo[U >: T](that: Future[U]): Future[U]
,你看到的印刷品是因为该块未被懒惰地评估:
f2
因此fallbackTo
似乎在传递给f2
时启动(因此执行了print语句)。可能它是一个设计选择,如果它被懒惰评估f1
只有在recoverWith
失败后才会启动。
如果您想避免这种行为,可以使用仅在失败后触发的f1.recoverWith{ case _ => println(123); Future { 6 } }
:
{{1}}