この質問の著者のように、私は Scala 2.10 の先物と約束でユーザーに見える約束の理由を理解しようとしています。
特に、SIP の例に戻ると、完全に欠陥があるわけではありません。
import scala.concurrent.{ future, promise }
val p = promise[T]
val f = p.future
val producer = future {
val r = produceSomething()
p success r
continueDoingSomethingUnrelated()
}
val consumer = future {
startDoingSomething()
f onSuccess {
case r => doSomethingWithResult()
}
}
produceSomething
への呼び出しで実行時例外が発生するケースを想像しています。promise と Producer-future は完全に切り離されているため、システムがハングし、consumer が成功または失敗で完了することはありません。
したがって、約束を使用する唯一の安全な方法には、次のようなものが必要です
val producer = future {
try {
val r.produceSomething()
p success r
} catch {
case e: Throwable =>
p failure e
throw e // ouch
}
continueDoingSomethingUnrelated()
}
これは明らかにエラーが発生しやすく、冗長です。
目に見えるプロミス タイプで確認できる唯一のケースfuture {}
(不十分な場合) は、MAD の回答のコールバック フックの 1 つです。しかし、SIP の例は私には意味がありません。