我怎样才能结合两个Future [JsArray]?

时间:2016-08-25 14:52:16

标签: scala future

我有两个Future[JsArray]f1f2,我需要等待两个结果都完成。

如果它们都成功,最终结果应该是Success保持其内容的总和。如果其中至少有一个失败,则最终结果应为Failure

我该怎么做?

4 个答案:

答案 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}

如果f1f2失败,resultF也会因f1f2失败的相同例外而失败。

您可以选择删除括号

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)

一种解决方案

  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)
    
  2. 定义一个merge函数,用于合并两个JsArray(即提取和连接元素,并使用结果创建一个新的{{1} }}):

    JsArray

    注意:您需要输入类型才能将生成的def merge(array1: JsArray, array2: JsArray): JsArray = JsArray(array1.elements ++ array2.elements: _*) 传递给JsArray's apply method

  3. 呼叫

    Vector
  4. 在REPL

    中运行试运行
    map2(f1, f2)(merge)