在双方都结束时返回两个Scala期货

在双方都结束时返回两个Scala期货,scala,Scala,下面的method1尝试返回两种未来方法组合的结果someFutureMethod1和someFutureMethod2。有没有办法让这一切顺利进行?理想情况下,首先结束的方法应该等到第二个结束,然后返回组合的未来值 def method1 ( s: Seq[Int]): Future [(Int,Int)] = { s.map { sx => val future = someFutureMethod1 (sx) future.ma

下面的
method1
尝试返回两种未来方法组合的结果
someFutureMethod1
someFutureMethod2
。有没有办法让这一切顺利进行?理想情况下,首先结束的方法应该等到第二个结束,然后返回组合的未来值

  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
  }
def方法1(s:Seq[Int]):Future[(Int,Int)]={
s、 映射{sx=>
val future=someFutureMethod1(sx)
future.map{
结果=>result
}
val future2=某些未来方法2(sx)
未来2.地图{
结果2=>result2
}

(result,result2)//您将未来的合并到一个映射中,因此看起来您必须返回此类未来的序列:

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

很容易将futures与zip结合起来:
future.zip(future2)
。但是你也映射到一个Seq上。所以看起来你应该返回一个这样的未来的Seq,对吗?不,它应该返回一对ints,但是Seq上的map返回另一个Seq。那么你想如何组合未来的来只返回一个未来呢?我的错,你应该返回一个Seq,然后查看我的答案。除了之外,还使用
Future.sequence
ode>future.zip
将生成一个带有签名的方法
future[Seq[(Int,Int)]]
。这在大多数情况下更易于使用。听起来很合理。事实上,作者问了怎么做,但随后删除了注释。因此我认为他们自己已经解决了这个问题。