使用_或Else _减少两个期权期货不会产生一些

时间:2015-07-28 20:56:00

标签: scala future

受到this question的启发,我认为以下是一个解决方案:

import scala.concurrent.Future

val x: Future[Option[Int]] = Future.successful { None }
val y: Future[Option[Int]] = Future.successful { Some(55) }

Future.reduce(Seq(x, y))(_ orElse _).value  // expecting Some(Success(Some(55)))

令我惊讶的是,在REPL中执行此操作主要是None不正常地给予Some(55)

res80: Option[scala.util.Try[Option[Int]]] = None
res81: Option[scala.util.Try[Option[Int]]] = None
res82: Option[scala.util.Try[Option[Int]]] = None
res83: Option[scala.util.Try[Option[Int]]] = Some(Success(Some(55)))
res84: Option[scala.util.Try[Option[Int]]] = None

这对我来说是一个Scala WTF时刻。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

显然两个期货都已完成并不重要,默认执行上下文可能仍然决定产生未来的结果,因此它可能只在不久之后完成。

Await.result(Future.reduce(Seq(x, y))(_ orElse _), Duration.Inf) // Some(55)

答案 1 :(得分:2)

此较小的代码具有相同的结果:Future(42).value(有时打印None)。

实际上问题是你如何使用value方法(来自scaladoc):

  

如果未来未完成,则返回值为None

如果你想确定它会产生一个价值,你需要等待未来。