ReactiveExtensions
RxJS
Rx
RxJSDay 18

RxJS の Disposable とその種類

More than 3 years have passed since last update.

この記事は bouzuya's RxJS Advent Calendar 2015 の 18 日目かつ RxJS Advent Calendar 2015 の 18 日目です。


はじめに

今日は Disposable とその種類を見ていきます。個人的な理由で時間がないので一覧とメモになっています。

RxJS 4.0.7 を対象にしています。


Disposable とその種類


Disposable

Disposabledispose を持つ 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 にはいくつかの種類があります。

これらは superclass の実装を必要としないせいか、Disposable を継承していません。また Disposable を名前に含まないものの dispose を持ち Disposable として扱われている AutoDetachObserver などもあります。


BinaryDisposable

BinaryDisposable の constructor は 2 つの Disposable を引数に取ります。dispose で、それらの 2 つの Disposabledispose を呼び出します。


CompositeDisposable

CompositeDisposable の constructor は複数の Disposable または Disposable の配列を引数に取ります。また add / remove で、それらの Disposable へ追加・削除できます。dispose で、それらのすべての Disposabledispose を呼び出します。

removedispose されていなければ削除できます。add は既に CompositeDisposabledispose されていれば、追加した瞬間に dispose されます。


NAryDisposable

CompositeDisposable から add / remove を除いたものです。


RefCountDisposable

constructor では Disposable を引数に取ります。getDisposablecount++ し、disposecount-- します。count === 0 のとき、constructor で取った Disposabledispose します。

ちなみに Observable.prototype.refCount で返されるわけではありません。


ScheduledDisposable

ScheduledDisposable の constructor は schedulerdisposable を引数に取り、 dispose を呼び出されたときに scheduler に従って dispose を呼び出します。


SerialDisposable

getDisposable / setDisposable を持ち、ひとつの disposable を内部に保持します。setDisposable を複数回呼び出すと、保持している disposabledispose して新しい Disposable を保持します。


SingleAssignmentDisposable

getDispoable / setDisposable を持ち、ひとつの disposable を内部に保持します。setDisposable を複数回呼び出すと、既に disposable を保持している場合は例外を投げます。


おわりに

今日は Disposable とその種類を確認しました。

個人的な理由で時間がなく、どう使われるのかなどに触れられていないのが残念です。