我的代码:
val f1 = Future[String] { "ok1" }
val fRes: Future[String] = for { r <- f1 } yield r
我希望fRes
是一个字符串,但我得到一个Future[String]
。为什么呢?
我不想使用Await.result
。
val fRes = for { r <- Await.result(f1, Duration(1, TimeUnit.SECONDS)) } yield r
答案 0 :(得分:2)
for
和yield
的组合不会“解开”Future
。
在实践中这是一件好事。
因此,每种Option
,Try
,List
或者功能强大的人称之为Applicative Functor
都会保持这种类型。
由于这个属性,您可以在<{1}}内编码,就好像代码是“解包”一样,但这只是因为它确保在代码之外的东西保持包装。 / p>
在查看引擎盖下的 如果你想在最后访问未来的价值并在同步程序流程中做一些事情你只需要选项 正如@Robert Udah建议你可以使用for { <- }
时,可能会更清楚。它是链式for-comprehension
和map
操作的语法糖。flatMap
val x: Option[_] = Some(5).map{ i =>
// i is "unwrapped" here
(i * i).toString
}
val x: Option[_] = for {
i <- Some(5)
} yield i.toString // i unwrapped for the for comprehension but will keep Option type
并拥有回调功能,或者你必须使用onComplete
。