0

我对以下代码有疑问。我希望在所有 groundCoffee、heaterWater、frothedMilk 方法完成后触发“combine”方法。它们将被同时触发。所有 4 种方法磨碎、加热水、泡沫牛奶、冲泡都是使用未来同时执行的。

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!

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

4

2 回答 2

1

Await当您想故意阻止该线程上的执行时,已经发布到未来的解决方案是一个解决方案。这样做的两个常见原因是为了测试,当你想在做出断言之前等待结果,否则所有线程都会退出(就像做玩具示例时的情况一样)。

然而,在适当的长寿命应用Await中,通常应避免使用。

您的问题已经包含了一种正确的方式来做未来的作文 - 使用理解。请记住,for-comprehensions 将转换为 flatMaps、maps 和 withFilter 操作,因此您在 for-comprehension 中调用的任何期货都只会在其他期货完成后创建,即串行。

如果您希望一堆期货同时运行,那么您将在进入理解之前创建它们,就像您所做的那样。

于 2014-05-19T09:00:40.900 回答
0

您可以在这里使用等待:

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

我假设,你已经把所有的期货都打包在了一个列表中。Await.ready 使所有等待工作。

于 2014-05-19T07:53:37.890 回答