FutureとPromise in Scale

2703 ワード

ブログアドレス: http://blog.csdn.net/yueqian_zhu/
Futureとは、まだ準備ができていない値を表すオブジェクトです.この値は、ある計算プロセスの結果であることが多い.
一、作成
futureオブジェクトを作成する最も簡単な方法は、非同期(asynchronous)計算を有効にし、計算結果が保存されているfutrueを返すfutureメソッドを呼び出すことです.futureオブジェクトの計算が完了すると、その結果が使用可能になります.futureメソッドが正常に実行されるには、コンテキスト実行がコミットされたタスクを実行する必要があります.また、実行コンテキストをスレッドプールと見なすこともできます.これは、非同期計算がどのように実行されるか、いつ実行されるかを処理できるため、futureメソッドにとって少なくありません.独自の実行コンテキストを定義し、futureで使用できます.import ExecutionContext.Implicits.global例:デフォルトのグローバル実行コンテキストのインポート
二、コールバック関数
コールバックを登録する最も一般的な形式は、OnCompleteメソッド、すなわちTry[T] => Uタイプのコールバック関数を作成することです.futureが正常に完了すると、コールバックはSuccess[T]タイプの値に適用され、そうでない場合はFailure[T]タイプの値に適用されます.処理に成功しただけの関数(onSuccess)を登録するか、処理に失敗しただけの関数(onFailure)を登録します.
三、map/flatMap
mapは、新しいfutureオブジェクトを作成できます.Failureインスタンスで呼び出された場合は、このインスタンスを直接返します.Successインスタンスで呼び出された場合、対応するメソッドが実行されます.以下に返されるタイプから違いがわかります.
val numF = Future{ 3 }
val stringF: Future[Future[String]] = numF.map(n => Future(n.toString))
val flatStringF: Future[String] = numF.flatMap(n => Future(n.toString))

四、recover/recoverWith
recoverは、バイアス関数を受け入れ、別のFutureに戻る新しいfutureオブジェクトを作成します.場合  recover  Successインスタンスで呼び出されると、そのままこのインスタンスに戻ります.そうしないと、バイアス関数が呼び出されます.バイアス関数が与えられた場合  Failure  処理アクションを定義し、  recover  戻る  Success  ,バイアス関数の実行結果が含まれています.そうしないと、最終的に結果を生成するfutureも失敗し、同じThrowableを返します.
recoverWithとrecoverの違いは,このバイアス関数のタイプにある.次のようになります.
f recover { case cause => throw new Exception("Something went wrong", cause) }
f recoverWith{
  case ex:Exception => Future.failed(new Exception("foo", ex))
}

五、
fallbackTo
future1 fallbackTo future2:
1、future 1が成功した場合に結果を返す
2、future 1が失敗し、future 2が成功した場合はfuture 2の結果を返す
3、いずれも失敗し、future 1の異常オブジェクトに戻る
六、andThen
andThenで返された新しいFutureは、元のFutureが成功しても失敗しても元のFutureと同じ結果を返します.複数のandThen間の順序の実行を保証することを目的としています
七、promise
1、
val p = promise[T]
val f = p.future
p success result// result    promise,  ,f      ( onSuccess  )     。
p failure (new IllegalStateException)//       promise,  ,f      ( onFailure  )     ,      onSuccess      。

promisesには、単一の付与の意味があります.したがって、それらは一度しか実現できません.計算済みのpromiseまたはfailedのpromiseでsuccessメソッドを呼び出すと、IllegalStateException例外が放出されます.
2、completeWith方法は別のfutureでpromise計算を完成する
val f = future { 1 }
val p = promise[Int]
p completeWith f
p.future onSuccess {
    case x => println(x)
}

3、Promise伴生オブジェクトで完成したFutureを作成します.val future=Promise.successful(「Yay!」) 
または失敗:val otherFuture=Promise.failed[String](new IllegalArgumentException(「Bang!」)