我有两个Future[JsArray]
,f1
和f2
,我需要等待两个结果都完成。
如果它们都成功,最终结果应该是Success
保持其内容的总和。如果其中至少有一个失败,则最终结果应为Failure
。
我该怎么做?
答案 0 :(得分:4)
您可以使用'组合期货。句法。类似的东西:
val f1:Future[Int] = getF1()
val f2:Future[Int] = getF2()
val res:Future[Int] = for (
v1 <- f1;
v2 <- f2
) yield (v1 + v2)
答案 1 :(得分:3)
直接和简单的解决方案
Future支持zip
操作非常方便。
val f1: Future[JsArray]
val f2: Future[JsArray]
val resultF = f1.zip(f2).map {case (a, b) => a ++ b}
如果f1
或f2
失败,resultF
也会因f1
或f2
失败的相同例外而失败。
您可以选择删除括号
val resultF = f1 zip f2 map { case (f1Result, f2Result) => f1Result ++ f2Result }
答案 2 :(得分:2)
假设通过&#34;求和数组&#34;你的意思是用++
连接它们,你希望这样做:
Future.sequence(Set(getF1,getF2)) map { _ reduce(_ ++ _)}
当且仅当所有期货成功时,序列才会成功。然后,我们将所有元素的Set
减少++
。
答案 3 :(得分:1)
为map2
s定义Future
函数:
def map2[A, B, C](fa: Future[A], fb: Future[B])(g: (A, B) => C)
(implicit executor: ExecutionContext): Future[C] =
for {
a <- fa
b <- fb
} yield g(a, b)
定义一个merge
函数,用于合并两个JsArray
(即提取和连接元素,并使用结果创建一个新的{{1} }}):
JsArray
注意:您需要输入类型才能将生成的def merge(array1: JsArray, array2: JsArray): JsArray =
JsArray(array1.elements ++ array2.elements: _*)
传递给JsArray
's apply
method。
呼叫
Vector
map2(f1, f2)(merge)