我遇到以下代码问题。我希望'组合'方法在所有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!
此后程序退出。当我试图学习期货时,我从一个网站得到了这个例子。如何使程序等待,以便在所有期货收益后触发组合方法?
答案 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使所有的等待工作。