如何等待Scala Futures的结果进行理解

时间:2014-05-19 07:29:43

标签: scala for-loop for-comprehension

我遇到以下代码问题。我希望'组合'方法在所有groundCoffee,heaterWater,frothedMilk方法完成后被触发。它们将被同时触发。所有4种方法研磨,heatWater,frothMilk,brew都是使用未来同时执行的。

def prepareCappuccino(): Future[Cappuccino] = {
  val groundCoffee = grind("arabica beans")
  val heatedWater = heatWater(Water(20))
  val frothedMilk = frothMilk("milk")
  for {
    ground <- groundCoffee
    water <- heatedWater
    foam <- frothedMilk
    espresso <- brew(ground, water)
  } yield combine(espresso, foam)
}

当我执行上述方法时,我得到的输出低于

start grinding...
heating the water now
milk frothing system engaged!

此后程序退出。当我试图学习期货时,我从一个网站得到了这个例子。如何使程序等待,以便在所有期货收益后触发组合方法?

2 个答案:

答案 0 :(得分:1)

当您想要故意阻止该线程上的执行时,已经发布到Await以获取未来的解决方案是一种解决方案。执行此操作的两个常见原因是用于测试,当您想要在进行断言之前等待结果时,以及否则所有线程都将退出(就像进行玩具示例时那样)。

然而,在适当的长期应用中,Await通常是要避免的。

您的问题已经包含了进行未来构图的正确方法之一 - 使用for comprehension。请记住,for-comprehension转换为flatMaps,maps和withFilter操作,因此你在for-comprehension中调用的任何期货只会在其他完成之后创建,即连续完成。

如果你想要一堆期货同时运作,那么你就可以在输入for-comprehension之前创建它们。

答案 1 :(得分:0)

您可以在此处使用Await:

val f = Future.sequence(futures.toList)
Await.ready(f, Duration.Inf)

我假设你把所有的期货打包在一个清单中。 Await.ready使所有的等待工作。