为什么解析未来的结果类型是未来?

时间:2016-06-07 14:12:16

标签: scala future

我的代码:

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

1 个答案:

答案 0 :(得分:2)

foryield的组合不会“解开”Future。 在实践中这是一件好事。

因此,每种OptionTryList或者功能强大的人称之为Applicative Functor都会保持这种类型。

由于这个属性,您可以在<{1}}内编码,就好像代码是“解包”一样,但这只是因为它确保在代码之外的东西保持包装。 / p>

在查看引擎盖下的for { <- }时,可能会更清楚。它是链式for-comprehensionmap操作的语法糖。

flatMap

如果你想在最后访问未来的价值并在同步程序流程中做一些事情你只需要选项

正如@Robert Udah建议你可以使用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