Search code examples
scalafuturefor-comprehension

Scala Pattern: For Comprehension that Yields a Future[A]


What is the pattern used in Scala to deal with the scenario:

You have a bunch of futures (they can be whatever, but for the sake of example...)

val aF = Future { true }
val bF = Future { Option(3) }
val cF = Future { myObject }

and you have some function that returns a future

def fooF: Future[SomeObject]

I want to do something like:

for {
    a <- aF
    b <- bF
    c <- cF
} yield {
    if (a) {
        // do stuff with b & c
        fooF
    } else {
        Future.successful(SomeObject)
    }
}

I want to return a value of Future[SomeObject], but I call fooF inside of the yield statement, I will get a Future[Future[SomeObject]]


Solution

  • Here is another solution :

    def doStuffWith(a: A, b: B, c: C): Future[SomeObject] = if (a) {
      // do stuff with b & c
      fooF
    } else Future.successful(SomeObject)
    
    for {
      a <- aF
      b <- bF
      c <- cF
      d <- doStuffWith(a, b, c)
    } yield d
    

    As discussed in @laughedelic answer, this is a subjective view, but I believe this way to be more readable, and maintainable (taking out the function always to unit test it, for instance).