如何为...收益剥夺未来?

时间:2014-03-17 16:56:04

标签: scala

我正在努力理解这段代码如何剥离'未来。

getFutureResult()返回Future[String]。那么为什么收益率的回报只是String

def getFutureResult:Future[String] = { ... }

def getMyResult:String = {

   for {
     myFutureResult <- getFutureResult()
   } yield {
     myFutureResult
   }

}

1 个答案:

答案 0 :(得分:1)

根据Scala for翻译 - 理解翻译规则:

for (x <- <expr>) yield f(x)

变为:

<expr>.map(x => f(x))

如果<expr>具有集合类型,未来或其他类型,那么编译器无论如何都无法完成。 Scala中的Future有一个方法map,因此它使用上面的myFutureResult String来构建另一个Future[String]

您永远不知道生成的未来getMyResult是否已完成 - 您应该安装一个onComplete回调,一旦完成,将由生成的未来调用:

getMyResult onComplete {
  case Success(x) => println("Yes! " + x)
  case Failure(t) => println("An error: " + t)
}

onComplete方法的代码是异步执行的 - 它可能发生在不同的线程上,很久以后或同时发生。

如果您确实需要知道Future是否已完成,请使用:

Await(getMyResult, 0 nanos)

用于阻止调用线程的模式,直到getMyResult未来完成。一般情况下,您应该避免这种情况,并使用Future构建for代码 - 理解和回调。