この記事は bouzuya's RxJS Advent Calendar 2015 の 18 日目かつ RxJS Advent Calendar 2015 の 18 日目です。
はじめに
今日は Disposable とその種類を見ていきます。個人的な理由で時間がないので一覧とメモになっています。
RxJS 4.0.7 を対象にしています。
Disposable とその種類
Disposable
Disposable は dispose を持つ class です。subscribe の戻り値は Disposable です。dispose することで unsubscribe (例えば removeEventListener ) されます。Operator ごとに様々な Disposable を使っています。ちなみに概要は 2 日目にも書きました。
Disposable の constructor は action を引数に取り、dispose 呼び出しで一度だけ action を実行します。
大した関数は持たないので実装を挙げます。
-
Disposable.create...(action) => new Disposable(action) -
Disposable.empty...{ dispose: noop } -
Disposable.isDisposable...(d) => d && isFunction(d.dispose) -
Disposable.prototype.dispose... 前述の通りです。
Disposable にはいくつかの種類があります。
-
DisposableSource CodeDisposableAPI Document BinaryDisposableSource Code-
CompositeDisposableSource CodeCompositeDisposableAPI Document NAryDisposableSource Code-
RefCountDisposableSource CodeRefCountDisposableAPI Document ScheduledDisposableSource Code-
SerialDisposableSource CodeSerialDisposableAPI Document -
SingleAssignmentDisposableSource CodeSingleAssignmentDisposableAPI Document
これらは superclass の実装を必要としないせいか、Disposable を継承していません。また Disposable を名前に含まないものの dispose を持ち Disposable として扱われている AutoDetachObserver などもあります。
BinaryDisposable
BinaryDisposable の constructor は 2 つの Disposable を引数に取ります。dispose で、それらの 2 つの Disposable の dispose を呼び出します。
CompositeDisposable
CompositeDisposable の constructor は複数の Disposable または Disposable の配列を引数に取ります。また add / remove で、それらの Disposable へ追加・削除できます。dispose で、それらのすべての Disposable の dispose を呼び出します。
remove は dispose されていなければ削除できます。add は既に CompositeDisposable が dispose されていれば、追加した瞬間に dispose されます。
NAryDisposable
CompositeDisposable から add / remove を除いたものです。
RefCountDisposable
constructor では Disposable を引数に取ります。getDisposable で count++ し、dispose で count-- します。count === 0 のとき、constructor で取った Disposable を dispose します。
ちなみに Observable.prototype.refCount で返されるわけではありません。
ScheduledDisposable
ScheduledDisposable の constructor は scheduler と disposable を引数に取り、 dispose を呼び出されたときに scheduler に従って dispose を呼び出します。
SerialDisposable
getDisposable / setDisposable を持ち、ひとつの disposable を内部に保持します。setDisposable を複数回呼び出すと、保持している disposable を dispose して新しい Disposable を保持します。
SingleAssignmentDisposable
getDispoable / setDisposable を持ち、ひとつの disposable を内部に保持します。setDisposable を複数回呼び出すと、既に disposable を保持している場合は例外を投げます。
おわりに
今日は Disposable とその種類を確認しました。
個人的な理由で時間がなく、どう使われるのかなどに触れられていないのが残念です。