Что такое использование Scala Future.fallbackTo

учитывая этот код

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. Однако код в блоке fallbackTo выполняется независимо от того, происходит ли сбой f1 или нет. Я ожидал, что блок fallbackTo будет выполнен только в случае сбоя f1.

возможно, мой пример слишком прост (или просто неправильный), но в чем польза fallbackTo?

1 ответов


вы правы, f1 возвращается, если он успешен, если нет f2 печати вы видите, это из-за того, что блок не оценивается лениво:

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

получается, что f2 запускается, когда он передается fallbackTo (и, следовательно, выполняется инструкция print). Вероятно, это выбор дизайна, если бы он был лениво оценен f2 был бы запущен только после отказа от f1.

если вы хотите избежать этого вид поведения, который вы можете использовать recoverWith который запускается только после сбоя:

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