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
です。