顺序执行任意数量的Scala Futures列表

时间:2016-04-27 07:47:59

标签: scala promise future

我读到了Scala Futures and Promises

我知道我可以使用回调,flatMap组合器或for-comprehension来连锁期货。未来完成后,将开始另一个未来,依此类推。

有没有办法链接存储在Scala集合中的任意数量的期货的执行(例如List)? 我试图在这个期货列表上调用Future.sequence,但它们一起启动,它们同时执行(不是按顺序执行)。

2 个答案:

答案 0 :(得分:4)

我的回答是更关心如何处理任意数量的 Scala期货函数的列表。

  type FUTURE_FUNCTION = String => Future[String]

  def compose(fs: List[FUTURE_FUNCTION]): FUTURE_FUNCTION = fs match {
    case List(head) => head
    case head :: tail => head(_).flatMap { u => compose(tail)(u) }
  }

在上面的代码段中,使用高阶Future函数参数创建撰写方法。并且这个方法迭代所有高阶函数并组成一个全新的Future函数。

使用示例:

  val f1: String => Future[String] =
    (s: String) => Future {
      s.toUpperCase
    }


  val f2: String => Future[String] =
    (s: String) => Future {
      s + " Hello World"
    }

  compose(List(f1, f2))("foo bar")
  > FOO BAR Hello World

答案 1 :(得分:0)

def chainFutures(list: List[() => Future[Any]]): Future[Any] = {
  list match {
    case x :: Nil => Future.successful(x)
    case (x :: xs) => x() flatMap (_ => chainFutures(xs))
  }
}
如果您可以接受提供返回Future的函数列表,那么这应该可以执行您想要的操作。 List[Future[_]]的问题是,它们已经启动,因此无法在执行方面进行链接。除了您提供单个帖子ExecutionContext

如果失败,它将返回第一个失败并停止执行另一个期货。