今さら感あるがメモが出てきたので貼っておく。
いろんなところから解説をピックアップ。
公式: Future と Promise | Scala Documentation
Promise は書き込み可能で、1度だけ代入できるコンテナで Future を完了させるもの
成功あるいは失敗を表す値を設定することによってFutureに変換することのできるクラスです。
Scala の Future ってどうやって使うの?Promiseって何? - ましめも
- Future[A] いつか型Aの値が与えられる型
- Promise[A] いつか型Aの値を与える型
Promise[A] から Future[A] を作ることができる。
要は結果型の A
を与える主体が Promise ということ。
どういうケースで Promise を使うのか
Promise は Future が成功しても失敗しても何か後処理をする、みたいなコールバックで使える。
コールバックなら Future.onComplete
でもいいのだが、ここで Promise を使うケースとは?
Promise を使う場合というのは、
「 Future の完了時に何かを行う」のではなく、
「何かを行った結果で Future を完了させる(+完了の型(Future[A]
のA
)を与える)」、
という立ち位置となる。
(立ち位置を無視しつつ Future の型に変化がない場合は Future.onComplete でも同じことができる)
使用例
mainF という Future が完了したら、p という Promise を完了させて、Future[A] を得る
val p = Promise[A]
mainF.onComplete(main => p.complete(...))
p.future
これにより、onComplete
内の処理が成功することで Future を成功させるということができる。
なので、上記の p.future
で得られた Future が Success ならば、onComplete
内の処理も成功としているということになる。
mainF
というメイン処理の Future が Success でも onComplete
内の後始末処理が Failure
ならば、 p.future
は Failure
になる。
みたいなことができる。
「後始末処理の結果をもって Future を完了させる」と捉えることができる。