私は2つのFuture[JsArray]
,f1
およびf2
を持っています。私は両方が結果で完了するのを待つ必要があります。2つのFuture [JsArray]をどのように組み合わせることができますか?
両方とも成功した場合、最終結果は内容の合計を保持するSuccess
である必要があります。少なくとも1つが失敗した場合、最終結果はFailure
でなければなりません。
どうすればいいですか?
私は2つのFuture[JsArray]
,f1
およびf2
を持っています。私は両方が結果で完了するのを待つ必要があります。2つのFuture [JsArray]をどのように組み合わせることができますか?
両方とも成功した場合、最終結果は内容の合計を保持するSuccess
である必要があります。少なくとも1つが失敗した場合、最終結果はFailure
でなければなりません。
どうすればいいですか?
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つのJsArray
S(すなわちマージするためmerge
関数を定義し、そして結果を使用して新しいJsArray
を作成してください):
def merge(array1: JsArray, array2: JsArray): JsArray =
JsArray(array1.elements ++ array2.elements: _*)
注:Vector
の結果をJsArray
's apply
methodに渡すには、タイプの昇格が必要です。
コール
map2(f1, f2)(merge)
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])
'for'構文を使用して先物を組み合わせることができます。 「合計する配列」であなたが++
とそれらを連結する意味と仮定すると
val f1:Future[Int] = getF1()
val f2:Future[Int] = getF2()
val res:Future[Int] = for (
v1 <- f1;
v2 <- f2
) yield (v1 + v2)
ストレートフォワードとシンプルなソリューション
将来は非常に便利です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 }
私は "ジップ"ソリューションが好きです - 余分な提案をありがとう – Randomize
これは配列の配列を作成するので、 'JsArray(jsArray1.elements ++ jsArray2.elements)' –
@AlvaroCarrascoそれはおそらくOPが望んでいるものだと私は推測しています。私はそれに応じて私の答えを修正します。 – Jubobs