Scala Future的用途是什么?

inkz8wg9  于 2023-03-18  发布在  Scala
关注(0)|答案(2)|浏览(152)

给定这个代码

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
}

result包含f1的结果。但是,无论f1是否失败,fallbackTo块中的代码都会执行。我希望fallbackTo块仅在f1失败时执行。
也许我的例子太简单了(或者只是错了),但是fallbackTo有什么用呢?

7ivaypg9

7ivaypg91#

您是正确的,如果成功,则返回f1,如果不是f2,则您看到的打印结果是因为块没有延迟求值:

def fallbackTo[U >: T](that: Future[U]): Future[U]

因此,f2似乎是在传递给fallbackTo时启动的(因此执行了print语句)。这可能是一个设计选择,如果它被延迟计算,f2将仅在f1失败后启动。
如果你想避免这种行为,你可以使用recoverWith,它只在失败后触发:

f1.recoverWith{ case _ => println(123); Future { 6 } }
tquggr8v

tquggr8v2#

另一种方法是显式强制f1失败:

val f1 = Future.failed(new Throwable)

 val f2: Future[Int] = Future { 6 }

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

相关问题