来自onComplete的Scala返回值

来自onComplete的Scala返回值,scala,Scala,我如何在Scala中构造onComplete以这样做: 图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(

我如何在Scala中构造onComplete以这样做:

图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都将
单元作为其返回类型

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,如何实现图2所示的目标?

您可以通过

valx:Future[Int]=foo.map(x=>5).recover{case f=>foo()}
//为你的未来做更多的工作
x、 地图(条形图)

假设
foo:Future[\u]
foo():Int

不建议通过等待将来的结果来阻止当前线程。相反,您应该在处理
result
future的结果时调用bar()函数

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

什么是“福”?A
未来
?我认为你应该充实一下你的例子。@mattinbits,谢谢,编辑了这个问题。你能想到在没有
等待
不阻塞的情况下怎么做吗?@krzasteka,我在这里只使用了
Await
来可视化在计算的某个点,当您想要检索
未来的结果时,您必须等待它。但是,您可以将进一步的操作链接到未来的
x
,这是正确的。难道不只是恢复捕获的异常吗?失败会无一例外地出现吗?我只是好奇的问一下。只有例外,未来才会失败。或者它可以被抛出而不被捕获在未来的体内,或者,例如,创建未来的承诺是通过
失败
方法完成的,该方法使用Throwable.Awesome参数化。谢谢@Alexander有时你想要,恢复只从初始结果恢复,而不被输入酒吧。。。六羟甲基三聚氰胺六甲醚