2016-09-01 13 views
4

私はFuturePromisesを使用してScala Concurrencyを寄付しています。将来のコールバックメソッドと約束[成功と失敗]の違いは?

私はポイントを取得していません。Callbackメソッドを使用して未来を完成させ、約束を使用することの正確な違いは何ですか?

未来のコールバックメソッドが実際に未来を完了していないことを意味しますか?プロミスを使用して未来を完成することができますか?

また、私は、先物と約束の両方から読むことができるような多くの場所を見てきましたが、約束だけに書き込むことができます。

答えて

3

先物のみ非同期計算の終わりに終了する。

val f: Future[List[Int]] = Future { 
    makeSomeNumbers() //when this finishes, the Future is completed. 
} 

f onSuccess { 
    case foo => println("I was completed when makeSomeNumbers finished") 
} 

約束を手動で完了することができる未来を生成することができる一方。

val p = Promise[String]() 
val f = p.future 

p success('hi') //when success is called, the Future is completed. 

f onSuccess { 
    case foo => println("I was completed because a Promise told me to do so") 
} 

onSuccessに渡されたコールバックは、将来を完了していない、それだけで将来が完了したときに耳を傾け、何かを行います。プロミスの場合、そのsuccessメソッドを呼び出して、関連する未来を完了することができます。

+0

すてきな説明のおかげで、私は 'future'を手作業で手動で完成させるべきですか? – Shankar

+1

@Shankarたとえば、コールバックのみをサポートするサードパーティのライブラリと統合する場合。 –

+0

'Future.apply(expr)'は 'Future.unit.map(_ => expr)'の構文砂糖です。 –

0

実際にはは完了しません。Futureは、完了時にコールバックをトリガに渡すだけです。コールバックがトリガーされるときには、Promiseを使用して制御することができます。 Scalaの公式ドキュメントからの例:

val p = Promise[T]() 
val f = p.future 

val producer = Future { 
    val r = produceSomething() 
    p success r 
    continueDoingSomethingUnrelated() 
} 

ところでFutureボンネットの下Promisesを使用。

3

completeFutureとすることはできません。

Futureは計算であり、この計算(一度開始)は完了すると完了します。あなたはそれを作成した後でそれを制御することはできません。 onCompleteコールバックを割り当てることができます。このコールバックは、この未来が完了した時点で解雇されますが、その時点では制御できません。

Futureを制御したい場合はPromiseFutureのような政治家ができます。あなたが成功したか失敗したかで将来を完了するかどうかは、あなた次第です。

// lets promise an Int 
val promise = Promise[Int]() 

// Now... we also have a future associated with this promise 
val future = promise.Future 

// assign a callback which will be called when future completes 
future.onComplete(
    case Success(i) => println("Future complete :: " + i) 
    case Failure(ex) => println("Future failed :: " + ex.toString) 
) 

// Future by itself provides you no way to complete it 

// if you want to complete this future, you can fulfil your promise 
promise.complete(10) 
+1

きちんと説明され、政治家のいいところがあります。 – Samar

+0

@Sarvesh Kumar Singh:AFAIK、将来の計算自体ではなく、http://stackoverflow.com/a/18961936/1907755を参照してください。 – Shankar

+0

計算による...私は現在のスレッドから独立した実行ブロックを意味します。 –

関連する問題