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