0

以下のコードに問題があります。すべてのgroundCoffee、heaterWater、frothedMilkメソッドが完了した後に「combine」メソッドがトリガーされるようにします。それらは同時にトリガーされます。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!

この後、プログラムは終了します。未来を学ぼうとしているときに、この例をサイトから入手しました。すべての先物が戻った後に結合メソッドがトリガーされるように、プログラムを待機させるにはどうすればよいですか?

4

2 に答える 2

1

将来のためにすでに投稿されてAwaitいるソリューションは、そのスレッドでの実行を意図的にブロックしたい場合のソリューションです。これを行う 2 つの一般的な理由は、テストのためです。アサーションを行う前に結果を待ちたい場合と、それ以外の場合はすべてのスレッドが終了する場合です (おもちゃの例を実行する場合のように)。

ただし、適切な長寿命のアプリケーションAwaitでは、一般的に避けるべきです。

あなたの質問には、将来の構成を行うための正しい方法の1つが既に含まれています-理解のために使用します。ここで、for-comprehensions は flatMaps、maps、および withFilter 操作に変換されるため、for-comprehension で呼び出す Future は、他のものが完了した後にのみ、つまりシリアルに作成されることに注意してください。

多数の先物を同時に操作したい場合は、これまでのように for-comprehension に入る前に先物を作成します。

于 2014-05-19T09:00:40.900 に答える