类似的问题已被问到here,但有些回复并未完全承认如何异步运行原始的“独立”Future
(而不是链接flatMap
s或for-comprehension)。我也很好奇这个案例有多个链接Future
,它们都依赖于原始Future
但不相互依赖。
无论如何,这就是我正在做的事情:
val f0 = Future { foo() }
val f1 = Future { bar() }
val f01 = for { v0 <- f0; v1 <- f1 } yield (v0, v1)
f01.flatMap { case (v0, v1) =>
val f2 = Future { baz(v0, v1) }
val f3 = Future { qux(v0, v1) }
for { v2 <- f2; v3 <- f3 } yield (v2, v3)
}
这就是我想做的事情:
val f0 = Future { foo() }
val f1 = Future { bar() }
for { v0 <- f0; v1 <- f1 } flatYield {
val f2 = Future { baz(v0, v1) }
val f3 = Future { qux(v0, v1) }
for { v2 <- f2; v3 <- f3 } yield (v2, v3)
}
有没有办法在不首先产生原始值然后在链式flatMap
的参数中再次写出它们的情况下执行此操作?
答案 0 :(得分:2)
它对你有用吗?
val f0 = Future { foo() }
val f1 = Future { bar() }
for {
v0 <- f0
v1 <- f1
f2 = Future { baz(v0, v1)}
f3 = Future { qux(v0, v1)}
v2 <- f2
v3 <- f3
} yield (v2, v3)
答案 1 :(得分:2)
另一种简化代码的方法是使用zip
的{{1}}方法:
Future
对于更多for {
(v0, v1) <- Future { foo() } zip Future { bar() }
r <- Future { baz(v0, v1) } zip Future { qux(v0, v1) }
} yield r
而不是多个Future
,您还可以使用zip
:
Future.sequence
在这两种情况下,压缩/排序的期货将并行执行(当然,取决于for {
List(a, b, c, d) <- Future.sequence(List(
Future { foo1() },
Future { foo2() },
Future { foo3() },
Future { foo4() }
))
/* ... */
} yield ???
)。