LoginSignup
1
2

More than 5 years have passed since last update.

RxJS 4 の merge の引数の差異 (concurrent 指定) と RxJS 5 での実装

Last updated at Posted at 2015-12-26

RxJS 4.0.7 の merge の引数には差異があります。

merge* の operator の document は、次の 3 つです。

これらは次のような引数を取れます。

  • Observable.merge([scheduler], ...observables)
  • Observable.prototype.mergeAll()
  • Observable.prototype.merge(observable)
  • Observable.prototype.merge(concurrent)

なぜ、このように引数が違うのでしょうか。

挙動の確認

Observable.merge([scheduler], ...observables)

Observable.merge(scheduler, ...observables)Observable.ofWithScheduler(scheduler, ...observables).mergeAll() です。

scheduler を省略した際は Scheduler.immediate が使われます。

最終的には Observable.prototype.mergeAll で merge されます。

Observable.prototype.mergeAll()

Observable.prototype.mergeAll() は流れてきた値を Observable として扱い subscribe します。流れてきた値 (Observable) に流れてきた値を自身の Observer に流します。

Observable.prototype.merge(observable)

Observable.prototype.merge(observables)Observable.merge(Scheduler.immediate, this, observable) です。

これも Observable.merge なので、最終的には Observable.prototype.mergeAll で merge されます。

Observable.prototype.merge(concurrent)

Observable.prototype.merge(concurrent)mergeAll と同様に流れてきた値を Observable として扱い subscribe します。ただし concurrent で指定された数までしか同時に subscribe しません。

これは上記 3 つとは異なる動作です。

たとえば this.merge(1)Observable.prototype.concatAll() の実装になっています。

なぜ mergeAll は concurrent を指定できないのか

おそらく他の実装との整合性などの過去のしがらみか何かでしょう。

Observable.prototype.merge(Number.POSITIVE_INFINITY) では実装できそうですが、されていません。

RxJS 5 では

RxJS 5 (5.0.0-beta.0 時点) ではその挙動が変更され Observable.prototype.mergeAll(concurrent) に変更されています。省略時は Number.POSITIVE_INFINITY です。

1
2
0

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
  3. You can use dark theme
What you can do with signing up
1
2