Подтвердить что ты не робот

Scala возвращаемое значение из onComplete

Как я могу структурировать onComplete в Scala, чтобы действовать таким образом:

рис. 1

{ 
  var x; 
  if(result.isFailure){
    x = foo() // foo is a future
  }

  if(result.isSuccess){
    x = 5
  }  
  bar(x)
}

Я думал, что смогу сделать это так:

рис. 2

var x = foo onComplete {
  case Success(x) => 5
  case Failure(t) => foo() //foo is a future
}
bar(x)

Но onComplete, onFailure и onSuccess имеют Unit как возвращаемый тип,

onComplete[U](f: (Try[T]) ⇒ U)(implicit executor: ExecutionContext): Unit
onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit
onFailure[U](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Unit

Как я могу достичь чего-то двухзначного без использования var?

4b9b3361

Ответ 1

Не рекомендуется блокировать текущий поток, ожидая результата из будущего. Вместо этого вы должны вызвать функцию bar() для обработки результатов result.

result map {r =>
   5
} recover {
   case _ => foo()
} map {r => 
   bar(r)
}

Ответ 2

Вы можете достичь своей цели с помощью

val x: Future[Int] = foo.map(x => 5).recover{case f => foo()}
// do some more work with your future
x.map(bar(_))

Предполагая, что foo: Future[_] и foo(): Int.