この記事は 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 にはいくつかの種類があります。
-
Disposable
Source CodeDisposable
API Document BinaryDisposable
Source Code-
CompositeDisposable
Source CodeCompositeDisposable
API Document NAryDisposable
Source Code-
RefCountDisposable
Source CodeRefCountDisposable
API Document ScheduledDisposable
Source Code-
SerialDisposable
Source CodeSerialDisposable
API Document -
SingleAssignmentDisposable
Source CodeSingleAssignmentDisposable
API 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
とその種類を確認しました。
個人的な理由で時間がなく、どう使われるのかなどに触れられていないのが残念です。