【问题标题】:Returning two Scala futures when both end两个都结束时返回两个 Scala 期货
【发布时间】:2017-02-07 07:20:22
【问题描述】:

下面的method1 尝试返回两个Future 方法someFutureMethod1someFutureMethod2 组合的结果。任何想法如何使这项工作?理想情况下,第一个结束的方法应该等到第二个结束,然后返回组合的未来值。

  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
  }

【问题讨论】:

  • 将期货与 zip 结合起来非常容易:future.zip(future2)。但您也映射到 Seq。所以看起来你应该返回一个这样的 Future 的 Seq,对吧?
  • 不,它应该返回一对 Ints
  • 但是 Seq 上的 map 返回另一个 Seq。那么您希望如何组合 Future 以仅返回一个 Future?
  • 我的错,你应该返回一个 Seq
  • 那看我的回答。

标签: scala


【解决方案1】:

您将 Future 组合在一张地图中,因此看起来您必须返回此类 Future 的 Seq:

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

【讨论】:

  • future.zip 之外使用Future.sequence 会产生带有签名Future[Seq[(Int, Int)]] 的方法。在大多数情况下,这会更容易使用。
  • 听起来很合理。实际上,作者询问了如何做到这一点,但随后删除了评论。所以我以为他们自己想通了。
猜你喜欢
  • 2019-05-21
  • 2019-09-01
  • 2019-05-12
  • 2017-10-04
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多