根据标题,给定IndexedSeq[Future[Foo]]
,我希望产生一个未来,当原始IndexedSeq
的所有期货都已完成时完成。最好的方法是什么?如果列表中有Future.sequence
之类的内容,是否有一种很好的方法来链接呼叫?
考虑两种情况:
bar.createFuture(blah) // Future[A]
.flatMap(f1) // f1: A -> Future[B]
.flatMap(f2) // f2: B -> Future[C]
.map(f3) // f3: C -> IndexedSeq[Future[D]],
// but would like to call flatMap(f3...???)
bar.createIndexedSeq(blah) // IndexedSeq[A]
.map(f1) // f1: A -> B
.map(f2) // f2: B -> C
.map(f3) // f3: C -> Future[D]
.??? // convert IndexedSeq[Future[D]]
// into Future[IndexedSeq[D]]
.map(f4) // f4: IndexedSeq[D] -> E
答案 0 :(得分:3)
Future.sequence
会从IndexedSeq[Future[Foo]]
转换为Future[IndexedSeq[Foo]]
,事实上它会将任何期货集合转换为持有相同类型集合的未来。
您的第一个用例可以写成:
for {
x <- bar.createFuture(blah)
y <- f1(x)
z <- f2(y)
w <- Future.sequence(f3(z))
} yield w
你的第二篇文章可以写成:
Future.sequence(bar.createIndexedSeq(blah) map f1 map f2 map f3) map f4
或Future.traverse
:
Future.traverse(bar.createIndexedSeq(blah) map f1 map f2)(f3) map f4