按顺序执行 return 未来的函数序列

Executing sequence of functions that return a future sequentially

我有一系列 return 未来的功能。我想按顺序执行它们,即在第一个函数 future 完成后,执行下一个函数,依此类推。有办法吗?

ops: Seq[() => Future[Unit]]

我认为应该这样做:

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 少,或者在失败时停止 - 应该很容易做到。

您可以将所有期货组合成一个 foldLeftflatMap:

def executeSequentially(ops: Seq[() => Future[Unit]])(
  implicit exec: ExecutionContext
): Future[Unit] =
  ops.foldLeft(Future.successful(()))((cur, next) => cur.flatMap(_ => next()))

foldLeft保证从左到右的顺序,flatMap保证顺序执行。函数使用 ExecutionContext 执行,因此调用 executeSequentially 不会阻塞。您可以添加回调或等待结果 Future when/if 您需要它。

如果您使用的是 Twitter Futures,那么我想您不需要通过 ExecutionContext,但是 foldLeftflatMap 的总体思路应该仍然有效。

如果给定一个 Seq[Future[T]],你可以像这样将它转换为 Future[Seq[T]]:

Val a: Seq[Future[T]] = ???

val resut: Future[Seq[T]] = Future.sequence(a)

比上面少一点样板:)