[英]How to wait for result of Scala Futures in for comprehension
以下代碼段出現問題。 我希望在所有GroundCoffee,heaterWater,frothedMilk方法完成后觸發“ combine”方法。 它們將同時被觸發。grind,heatWater,frothMilk,brew的所有4種方法都是使用Future同時執行的。
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!
然后程序退出。 當我嘗試學習期貨時,我從一個站點獲得了此示例。 如何使程序等待,以便在所有期貨返回后觸發合並方法?
當您要故意阻止該線程上的執行時,已經發布到Await
的解決方案是將來的解決方案。 進行此操作的兩個常見原因是進行測試,何時要在聲明前等待結果以及何時所有線程都將退出(例如在進行玩具示例時)。
但是,在適當的長壽命應用程序中,通常應避免Await
。
您的問題已經包含進行未來寫作的正確方法之一-使用for理解。 在此請記住,理解將轉換為flatMaps,map和withFilter操作,因此您在理解中調用的任何期貨只會在其他完成后(即依次執行)創建。
如果您希望一堆期貨同時運行,則可以在進入理解之前創建它們。
您可以在此處使用“等待”:
val f = Future.sequence(futures.toList)
Await.ready(f, Duration.Inf)
我認為,您已經將所有期貨打包在清單中。 Await.ready使所有的等待工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.