我读到了Scala Futures and Promises。
我知道我可以使用回调,flatMap
组合器或for-comprehension来连锁期货。未来完成后,将开始另一个未来,依此类推。
有没有办法链接存储在Scala集合中的任意数量的期货的执行(例如List
)?
我试图在这个期货列表上调用Future.sequence
,但它们一起启动,它们同时执行(不是按顺序执行)。
答案 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
。
如果失败,它将返回第一个失败并停止执行另一个期货。