2016-08-25 7 views
1

私は2つのFuture[JsArray],f1およびf2を持っています。私は両方が結果で完了するのを待つ必要があります。2つのFuture [JsArray]をどのように組み合わせることができますか?

両方とも成功した場合、最終結果は内容の合計を保持するSuccessである必要があります。少なくとも1つが失敗した場合、最終結果はFailureでなければなりません。

どうすればいいですか?

答えて

0

一つの解決策

  1. Future秒間map2関数を定義する:

    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. 要素を抽出して連結する2つのJsArray S(すなわちマージするためmerge関数を定義し、そして結果を使用して新しいJsArrayを作成してください):

    def merge(array1: JsArray, array2: JsArray): JsArray = 
        JsArray(array1.elements ++ array2.elements: _*) 
    

    注:Vectorの結果をJsArray's apply methodに渡すには、タイプの昇格が必要です。

  3. コール

    map2(f1, f2)(merge) 
    

REPLでの試運転

scala> import spray.json._ 
import spray.json._ 

scala> import scala.concurrent.Future 
import scala.concurrent.Future 

scala> import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.ExecutionContext.Implicits.global 

scala> val f1 = Future(JsArray(JsNumber(1), JsNumber(2))) 
f1: scala.concurrent.Future[spray.json.JsArray] = List() 

scala> val f2 = Future(JsArray(JsNumber(3), JsNumber(4), JsNumber(5))) 
f2: scala.concurrent.Future[spray.json.JsArray] = List() 

scala> map2(f1, f2)(merge).onComplete(println) 
Success([1,2,3,4,5]) 
+1

これは配列の配列を作成するので、 'JsArray(jsArray1.elements ++ jsArray2.elements)' –

+0

@AlvaroCarrascoそれはおそらくOPが望んでいるものだと私は推測しています。私はそれに応じて私の答えを修正します。 – Jubobs

3

'for'構文を使用して先物を組み合わせることができます。 「合計する配列」であなたが++とそれらを連結する意味と仮定すると

val f1:Future[Int] = getF1() 
val f2:Future[Int] = getF2() 
val res:Future[Int] = for (
    v1 <- f1; 
    v2 <- f2 
) yield (v1 + v2) 
+0

申し訳ありませんが削除できます。型は 'Int'ではなく' JsArray'です。私が得られないことは、 'res'の型が' Js * 'ではなく 'Future [String]'であるということです。 – Randomize

+0

JsArraysはどのように '合計'しますか? – Nyavro

+0

私はそれを知らない。私は '++'を期待していた – Randomize

1

、あなたがする探している:何か

Future.sequence(Set(getF1,getF2)) map { _ reduce(_ ++ _)} 

シーケンスがあれば成功すると、すべての先物は、成功した場合にのみ。その結果、すべての要素をで++に減らします。

+0

'value ++は、spray.json.JsArrayのメンバーではありません。 ' – Randomize

+1

私はあなたが達成しようとしている操作がわかりません。例がありますか? (もしあなたがすでに適用されている操作が '++'の代わりに置くことができます) – Esardes

2

ストレートフォワードとシンプルなソリューション

将来は非常に便利ですzip操作をサポートしています。

val f1: Future[JsArray] 
val f2: Future[JsArray] 
val resultF = f1.zip(f2).map {case (a, b) => a ++ b} 

f1またはf2失敗した場合、resultFf1またはf2失敗の同じ例外で失敗します。

、必要に応じて、あなたは括弧私は私の質問を編集した

val resultF = f1 zip f2 map { case (f1Result, f2Result) => f1Result ++ f2Result } 
+0

私は "ジップ"ソリューションが好きです - 余分な提案をありがとう – Randomize

関連する問題