Scala for/yield 块中的执行顺序

Execution order in Scala for/yield block

我使用以下语法进行了三个数据库调用(所有 return Future 值):

for {
  a <- databaseCallA
  b <- databaseCallB(a)
  c <- databaseCallC(a)
} yield (a,b,c)

第二次和第三次调用取决于第一次的结果,但两者可以运行并行。

如何让 databaseCallCdatabaseCallB 之后立即发出(无需等待结果 b)?

或者这已经发生了?

这目前没有发生 - 你已经告诉期货一个接一个地开始。要并行化第二个和第三个调用,您可以使用:

for {
  a <- databaseCallA
  (eventualB, eventualC) = (databaseCallB(a), databaseCallC(a))
  b <- eventualB
  c <- eventualC
} yield(a,b,c)

这将在 a 可用时立即开始 b 和 c 的计算,并在三元组的所有三个都可用后完成计算