Scala の Promise についてのメモ

2020/09/26   #scala 
このエントリーをはてなブックマークに追加

今さら感あるがメモが出てきたので貼っておく。


いろんなところから解説をピックアップ。

公式: Future と Promise | Scala Documentation

Promise は書き込み可能で、1度だけ代入できるコンテナで Future を完了させるもの

FutureとPromise · Scala研修テキスト

成功あるいは失敗を表す値を設定することによって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.futureFailure になる。
みたいなことができる。
「後始末処理の結果をもって Future を完了させる」と捉えることができる。