Что такое использование 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 } }