Scala从onComplete返回值

krz*_*eka 15 scala

如何在Scala中构造onComplete以这种方式操作:

图.1

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

  if(result.isSuccess){
    x = 5
  }  
  bar(x)
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以这样做:

图2

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

但是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
Run Code Online (Sandbox Code Playgroud)

如何在不使用var的情况下实现二维形式?

Ale*_*rev 12

不鼓励通过等待来自未来的结果来阻止当前线程.相反,您应该在处理result未来的结果时调用bar()函数.

result map {r =>
   5
} recover {
   case _ => foo()
} map {r => 
   bar(r)
}
Run Code Online (Sandbox Code Playgroud)


Til*_*ann 6

你可以实现你的目标

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

假设foo: Future[_]foo(): Int.