按顺序执行 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
少,或者在失败时停止 - 应该很容易做到。
您可以将所有期货组合成一个 foldLeft
和 flatMap
:
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 Future
s,那么我想您不需要通过 ExecutionContext
,但是 foldLeft
和 flatMap
的总体思路应该仍然有效。
如果给定一个 Seq[Future[T]],你可以像这样将它转换为 Future[Seq[T]]:
Val a: Seq[Future[T]] = ???
val resut: Future[Seq[T]] = Future.sequence(a)
比上面少一点样板:)
我有一系列 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
少,或者在失败时停止 - 应该很容易做到。
您可以将所有期货组合成一个 foldLeft
和 flatMap
:
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 Future
s,那么我想您不需要通过 ExecutionContext
,但是 foldLeft
和 flatMap
的总体思路应该仍然有效。
如果给定一个 Seq[Future[T]],你可以像这样将它转换为 Future[Seq[T]]:
Val a: Seq[Future[T]] = ???
val resut: Future[Seq[T]] = Future.sequence(a)
比上面少一点样板:)