[英]Executing sequence of functions that return a future sequentially
我有一系列返回未来的函数。 我想按顺序执行它们,即在第一个功能将来完成之后,执行下一个功能,依此类推。 有办法吗?
操作:Seq [()=> Future [Unit]]
您可以将所有期货与foldLeft
和flatMap
合并为一个期货:
def executeSequentially(ops: Seq[() => Future[Unit]])(
implicit exec: ExecutionContext
): Future[Unit] =
ops.foldLeft(Future.successful(()))((cur, next) => cur.flatMap(_ => next()))
foldLeft
确保foldLeft
的顺序, flatMap
提供顺序执行。 函数是使用ExecutionContext
,因此调用executeSequentially
不会阻塞。 您可以添加回调或在需要时在生成的Future
上等待。
如果您使用的是Twitter Future
,那么我想您不需要传递ExecutionContext
,但是foldLeft
和flatMap
的基本思想仍然可以使用。
如果给定了Seq [Future [T]],则可以将其转换为Future [Seq [T]],如下所示:
Val a: Seq[Future[T]] = ???
val resut: Future[Seq[T]] = Future.sequence(a)
样板比上述少:)
我相信应该这样做:
import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration
def runSequentially(ops: Seq[() => Future[Unit]]): Unit = {
ops.foreach(f => Await.result(f(), Duration.Inf))
}
如果您想减少等待Duration.Inf
,那么Duration.Inf
或在失败时停止-应该很容易做到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.