2017-02-06 4 views
0

method1は、2つの未来のメソッドsomeFutureMethod1someFutureMethod2の結果を返す試みです。どのようにこの作品を作るためのアイデア?理想的には、最初に終了するメソッドは、2番目が終了するまで待ってから、将来の値を組み合わせて返します。2つのScala先物の両方を返すとき

def method1 (s: Seq[Int]): Future [(Int,Int)] = { 
     s.map { sx => 
      val future = someFutureMethod1 (sx) 
      future.map { 
      result => result 
      } 
      val future2 = someFutureMethod2 (sx) 
      future2.map { 
      result2 => result2 
      } 
      (result,result2) // <-- the method should return the two results in the future 
     } 
    } 


def someFutureMethod1 (i: Int) = Future { 
    i + 1 
    } 

def someFutureMethod2 (i: Int) = Future { 
    i + 2 
    } 
+0

それはジップで先物を組み合わせることは非常に簡単です: 'future.zip(future2 ) '。あなたはSeqにもマップします。そのようなFutureのSeqを返す必要があるようですね。 – zhelezoglo

+0

いいえ、それはIntsのペアを返すべきです – ps0604

+0

しかし、Seqのmapは別のSeqを返します。それでは、どのように未来を一つの未来に戻すために結合したいのですか? – zhelezoglo

答えて

1

あなたは、このような将来のの配列を返すために持っているように見えるようにするには、マップに未来のを組み合わせる:

def method1 (s: Seq[Int]): Seq[Future [(Int,Int)]] = 
    s.map { sx => 
    val future = someFutureMethod1 (sx) 
    val future2 = someFutureMethod2 (sx) 
    future.zip(future2) 
    } 
+1

'' 'future.zip''に加えて' '' Future.sequence''''を使うと、署名 '' 'Future [Seq [(Int、Int)]]' ''を持つメソッドになります。それはほとんどの場合、使いやすくなります。 –

+0

合理的に聞こえる。実際には、著者はどのように行うのか尋ねたが、コメントを削除した。だから私は彼らが自分自身を考え出したと思った。 – zhelezoglo

関連する問題