如何在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)
你可以实现你的目标
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.