我正在努力理解这段代码如何剥离'未来。
getFutureResult()
返回Future[String]
。那么为什么收益率的回报只是String
?
def getFutureResult:Future[String] = { ... }
def getMyResult:String = {
for {
myFutureResult <- getFutureResult()
} yield {
myFutureResult
}
}
答案 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
代码 - 理解和回调。