2016-08-09 8 views
0

私は未来の計算をいくつか計算しています。結果を取りたいです。私はバリアントAwait.result(...)を使用しなければなりません(それはうまくいきます)。しかし、将来onSuccessメソッドがありますが、計算が終了する前に結果を取得することはできません。将来のonSuccessメソッドを使用する目的と範囲は何ですか?スカラの未来のメソッド

+0

通常、 'Await.result'は' Future'をブロックし、最初に 'Future'を使うことの利点を取り除く(ブロッキングを避ける)ので、避けるべきです。テストの時に例外がありますが、まれにしか見つかりません。 – handler

答えて

3

onSuccessは非ブロッキングです。

val f = Future { Thread.sleep(1000) } 
f.onSuccess { case _ => println("success" } 
println("before success") 

この意志出力:未来が正常に完了したとき

before success 
success 

onSuccessは必ず実行されます。このアプローチの主な利点は、将来が完了するのを待つ間に移動して他のことを行うことができることです。

Await.resultでは、Futureが完了するまで次の行に移動しません。

+0

それはいいです、それは先物の結果を操作する素晴らしい方法です。 – gregghz

+0

しかし、私は 'val sumF = Future {(1L〜100000L).sum}のようなコードを持っています。 sumF onSuccess {case s => println} '私はコンソールに結果が表示されるという保証はありません。 – pacman

+0

あなたは突然、先物を使用しません。これはアプリケーションのアプローチの問題です。あなたは非同期スタイルにしたいのですか?それは必要でしたか?等々。 – sascha10000

0

これは非同期的なアプローチであり、制御の反転を利用しています。これは、あなたの未来が終わると、その結果が処理できることを意味します。 Futures onSuccessに最終的な計算を入れることもできます。結果がある場合にのみ計算されます。たとえば、コールバックを使わずに結果を返す必要がある場合は、未来を待つか、単純にそれを返して、必要なところで結果を処理する必要があります。

関連する問題