scalatwitter-util

Executing sequence of functions that return a future sequentially


I have a sequence of functions that return a future. I want to execute them sequentially i.e. after the first function future is complete, execute the next function and so on. Is there a way to do it?

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


Solution

  • You can combine all the futures into a single one with a foldLeft and flatMap:

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

    foldLeft ensures the order from left to right and flatMap gives sequential execution. Functions are executed with the ExecutionContext, so calling executeSequentially is not blocking. And you can add callbacks or await on the resulting Future when/if you need it.

    If you are using Twitter Futures, then I guess you won't need to pass ExecutionContext, but the general idea with foldLeft and flatMap should still work.