search
LoginSignup
8

More than 5 years have passed since last update.

posted at

RxJS の Disposable とその種類

この記事は 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 とその種類を確認しました。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8