Scala中序列中的多个期货

Scala中序列中的多个期货,scala,future,Scala,Future,我有两个未来会发生的计算,如下所示: val comp1 = Future { ... } val comp2 = Future { ... } 我想让它运行,这样comp2总是在comp1完成后运行!我知道用一个for表达式,我可以组成这两个未来的 for { comp1Result <- comp1 comp2Result <- comp2 } yield { ... } 用于{ comp1ResultScala for comprehensions是“容器类型”(在

我有两个未来会发生的计算,如下所示:

val comp1 = Future { ... }
val comp2 = Future { ... }
我想让它运行,这样comp2总是在comp1完成后运行!我知道用一个for表达式,我可以组成这两个未来的

for {
  comp1Result <- comp1
  comp2Result <- comp2
} yield { ... }
用于{

comp1ResultScala for comprehensions是“容器类型”(在本例中为Futures)上flatMap和map调用组合的语法糖,因此您上面的代码等同于:

comp1.flatMap{ comp1Result => comp2 }
此处大括号内的计算仅在comp1完成并返回成功结果后发生(如果失败,则不会执行内部计算)

如果您在问题中所示的理解范围之外定义comp2,那么您就开始了计算(您只需忽略结果,直到进入理解范围),但如果您仅在中定义它以供理解,则在comp1成功完成之前不会启动它。因此,请尝试按如下方式重新调整代码:

val comp1 = Future { ... } // or you could put this construction inside the for as well
for {
  comp1Result <- comp1
  comp2Result <- Future { ... } // Only start the computation here
  comp3Result <- Future { ... } // etc. for as many such computations as you need
} yield { ... }

在一个链中有4个,每个链中的未来都需要一个,然后才能完成。如果你想要的话,你可以把另一个未来放在第一个未来的onComplete中,如果这符合你的目的呢ture2=future1.map(val=>2*val)
future2=future1.flatMap(val=>buildFuture(val))
Scala Async是否提供了与我的情况相同的行为?在这种特殊情况下,它可能会提供,但我强烈建议避免使用Async(至少在测试之外)如果可能的话,并且熟悉上面的“一元”计算风格,在这里您可以不断传播“上下文”(这里是未来的一元)尽可能长。将其视为对代码进行结构化,就像你正在为你想要做的事情编写处方一样,实际的计算链只在最后一刻执行。除了熟悉一元计算风格之外,你为什么不建议使用异步?也许“强烈”推荐是言过其实:)我觉得这很容易导致混淆什么代码片段在何时(何地)执行以及其他代码的可用结果。在简单的情况下,我相信您可以很好地管理它,而且它看起来很简单,但根据我的经验,生产代码很少保持如此简单。不过,我承认我没有使用过异步,因此有更丰富经验的人可能能够提供更好的指导。对我来说,理解的过程感觉更清晰,更容易推理。
  comp2Result <- comp2()