簡體   English   中英

如何等待Scala期貨的結果進行理解

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM