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]]
鉴于以下方法 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]]