【发布时间】:2022-01-23 17:36:22
【问题描述】:
我在一个 for yield 场景中遇到了 Scala 和多个期货的问题。 f1 和 f2 都是期货。 f2 future 基于从 f1 future 获得的值。
val result = for {
f1 <- Await.result(dao.findNode("nodeA"), 5 seconds) // This returns back a MyNode class
f2 <- if (f1 != None && f1.isUpAndRunning)
Future { LookupResult(true, f1.varA, f1.varB) }
else
lk ? Lookup(sm.id, sm.("address"))
} yield(f1, f2)
取决于 f1 的结果,当我的 if 语句计算结果为 false 时执行 Lookup()(这需要一些时间并返回 LookupResult),或者我模仿默认的 LookupResult。
返回以下错误:
类型不匹配。必需:Option[B_],找到:Future[(MyNode, Any)]
我只是没有正确映射结果吗?例如我应该在某处使用 asInstanceOf 吗?无论我做什么我都无法编译它。
非常感谢各位。
【问题讨论】:
-
未来
for-comprehension 中的Await.result看起来很可疑,目前还不清楚f1 != None && f1.isUpAndRunning在什么情况下可能有意义。不清楚你在问什么,缺少太多的上下文。请提供一个最小的孤立示例,该示例会产生与您要解决的问题类似的编译错误。 -
严格来说,
for理解应该用于相同的Monad。Await.result给你一个Option[A](所以Optionmonad。你的if案例给你一个Future[B],所以Futuremonad。我不知道你的 else 分支给你什么,但只是查看f1和if的f2案例,您应该能够看到您正在理解Option然后Future,那么为什么期望它能够工作?