Given the following methods that return a Future
...
def getProducts: Future[List[Product]] = { ... }
def sendOrder(p: Product, n: Int): Future[Order] = { ... }
... I need to invoke sendOrder
for each product returned by getProducts
and in the end yield
the number of products processed:
for {
products <- getProducts
// how do I iterate thru products and invoke sendOrder for each element?
...
} yield products.length
How do I deal with the list of products in the for comprehension above?
EDIT
Things get even more complex since I need to invoke a third method before sendOrder
if and only if getProducts
actually returns a nonEmpty list:
def doSomethingBeforeSendingOrder: Future[String] = { ... }
for {
p <- getProducts
// how do I invoke doSomethingBeforeSendingOrder before sendOrder and
// only if getProducts actually returns a nonEmptylist?
o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans)))
} yield o.length
I dont' know where that second arg to sendOrder should come from, but essentially you want to do something like:
Future.sequence will turn your List[Future[Order]] into a Future[List[Order]]