Scala:如何处理 Future 中的序列以进行理解

Scala: How to deal with sequences in a Future for comprehension

鉴于以下方法 return Future...

def getProducts: Future[List[Product]] = { ... }
def sendOrder(p: Product, n: Int): Future[Order] = { ... }

...我需要为 getProducts 编辑的每个产品调用 sendOrder,最后 yield 处理的产品数量:

for {
  products <- getProducts
  // how do I iterate thru products and invoke sendOrder for each element?
  ...
} yield products.length

如何处理上面for comprehension中的产品列表?

编辑

事情变得更加复杂,因为我需要在 sendOrder 之前调用第三个方法当且仅当 getProducts 实际上 return 是一个非空列表:

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

我不知道 sendOrder 的第二个参数应该从哪里来,但本质上你想做类似的事情:

for {
  p <- getProducts
  if p.nonEmpty
  _ <- someOtherMethodThatReturnsAFuture
  o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans)))
} yield o.length

Future.sequence 会将您的 List[Future[Order]] 变成 Future[List[Order]]