受到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时刻。我错过了什么吗?
答案 0 :(得分:3)
显然两个期货都已完成并不重要,默认执行上下文可能仍然决定产生未来的结果,因此它可能只在不久之后完成。
Await.result(Future.reduce(Seq(x, y))(_ orElse _), Duration.Inf) // Some(55)
答案 1 :(得分:2)
此较小的代码具有相同的结果:Future(42).value
(有时打印None
)。
实际上问题是你如何使用value
方法(来自scaladoc):
如果未来未完成,则返回值为
None
。
如果你想确定它会产生一个价值,你需要等待未来。