Scalaでは、私はAwait
を使用して、将来の完了を待つことができます。しかし、私がその未来を完了するとコールバックを登録すると、未来が完了するのを待つだけでなく、そのコールバックが終了するまで待つことができますか?ここでスカラ未来のonSuccessコールバックが完了するのを待つ方法を教えてください。
は、問題を説明するための最小限のが、完全なプログラムです:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{ Await, Future }
object Main {
def main(args: Array[String]): Unit = {
val f: Future[Int] = Future(0)
f.onSuccess { case _ =>
Thread.sleep(10000)
println("The program waited patiently for this callback to finish.")
}
// This waits for `f` to complete but doesn't wait for the callback
// to finish running.
Await.ready(f, Duration.Inf)
}
}
私は出力があることを期待:
The program waited patiently for this callback to finish.
その代わり、出力がありません。プログラムはコールバックが終了する前に終了します。
これは、先にthis questionで回答されている、今後の完了を待っているのと同じ問題ではないことに注意してください。
あなたが投げている場合は2つの先物を作るにはポイントがありません最初のものの値を離れてください。一つの未来にすべてを走らせるだけかもしれない。 –
これは、指定されたコードに可能な限り近づくことでした。実際のアプリケーションでは、最初の未来はあなたが実際に使用する価値を生むでしょう。 –
'map'と' flatMap'が 'onSuccess'と同じことを達成すれば(なぜならそれらは値を返すことができるので)、なぜAPI内に' onSuccess'があるのでしょうか? 'onFailure'との対称性だけですか?あるいは、 'onSuccess'と' onFailure'の下位レベルの構造体で 'map'と' flatMap'が実装されていますか? –