从scala futures获取价值

从scala futures获取价值,scala,Scala,我是scala的新手,从事期货工作。所以我有一个方法调用,它返回一个Future,我的代码如下 val futureResult = data.getState //this returns future Await.result(id, 10 seconds) // waiting for future to complete futureResult .onComplete({ case Success(result) => logger.info(s&

我是scala的新手,从事期货工作。所以我有一个方法调用,它返回一个Future,我的代码如下

val futureResult =  data.getState  //this returns future
    Await.result(id, 10 seconds)  //  waiting for future to complete
  futureResult .onComplete({
      case Success(result) => logger.info(s"resultis.. ${result}")
      case Failure(exception) => exception.printStackTrace()
    })
我在“结果”中得到了期望的结果,以防成功。但我想在一个变量中得到结果的值,并将其传递给其他方法。我试着跟着

val finalResult = futureResult.onComplete({
      case Success(result) => logger.info(s"resultis.. ${result}")
      case Failure(exception) => exception.printStackTrace()
    })

当我打印finalResult时,它是空的。我怎样才能使结果有价值,以便在其他地方使用它

最好是这样做:

val futureResult =  data.getState.map(res => fn(res))  //this returns future
  futureResult .onComplete({
      case Success(result) => logger.info(s"resultis.. ${result}")
      case Failure(exception) => exception.printStackTrace()
    })
或者至少:

val futureResult =  data.getState  //this returns future
  futureResult .onComplete({
      case Success(result) => 
           logger.info(s"resultis.. ${result}")
           fn(result)
      case Failure(exception) => exception.printStackTrace()
    })
但是执行wait.result会让您暴露这样一个事实:如果将来失败,可能会抛出异常,并使程序崩溃

包含预期“finalResult”的内容是
wait.result返回的内容

参见方法合同:

def result[T](awaitable : scala.concurrent.Awaitable[T], atMost : scala.concurrent.duration.Duration) : T

当您开始使用
Futures
和类似的对象(统称为“functor”或“monad”),这取决于它们的功能,()您使用的是容器、具有特殊属性的框,除非严格必要,否则您不想从它们中“获取值”。在
Future
的情况下,容器表示异步计算的值

这意味着您应该使用
map
flatMap
和类似的方法来使用计算结果。这样可以保持整个计算的异步性。同样,代码中的其他函数应该返回未来,并且应该尽可能多地携带它们

同时,如果将
未来
分配给变量,则将“未来容器”分配给变量,而不是
未来
将包含的值。这就是为什么在第二个示例中无法打印
finalResult

例如,您可以尝试:

def doSomething(值:字符串):单位=???
def CalculateMething(值:字符串):布尔=???
def CalculateMethingElse(值:布尔):未来[Int]=???
def myCode(…):未来[Int]={
返回字符串(…)的某些调用
.map{result=>
logger.info(s“结果是…$Result”)
//更多的计算结果
剂量测定(结果)
计算方法(结果)
}
.flatMap{someCalculationResult=>
//更多的计算。。。。
计算方法(结果)
}
}
如果你想处理异常,就像我想的那样,这就是你想要的,因为
transform
允许你操作成功的结果和异常

未来结果转换{
案例成功(结果)=>
println(s“结果为…$Result”)
//更多的计算结果
成功(计算方法(结果))
案例f@失败(例外)=>
例外情况。printStackTrace()
F
}
我知道,我听起来好像没有回答你的问题。你可能会想,“嘿,我想把这个值拿出来,用在别的地方,这个家伙并没有告诉我。”但除非在特定的情况下,这不是它们应该被使用的方式。转换到这种思维方式需要努力,而且在一开始就“看到应该如何做”并不容易


如果您仍然希望得到值,那么Vincent的答案是好的。

为什么不能在success内部调用该函数?应该编写而不是“提取”。想要从一元类型中“提取”值(
Future
Option
,…)会导致代码气味(通常是误解或设计不良的症状)。