import { Observable } from '../Observable';
|
import { ObservableInput, ObservableInputTuple, SchedulerLike } from '../types';
|
import { mergeAll } from '../operators/mergeAll';
|
import { innerFrom } from './innerFrom';
|
import { EMPTY } from './empty';
|
import { popNumber, popScheduler } from '../util/args';
|
import { from } from './from';
|
|
export function merge<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A[number]>;
|
export function merge<A extends readonly unknown[]>(...sourcesAndConcurrency: [...ObservableInputTuple<A>, number?]): Observable<A[number]>;
|
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `mergeAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
|
export function merge<A extends readonly unknown[]>(
|
...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike?]
|
): Observable<A[number]>;
|
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `mergeAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
|
export function merge<A extends readonly unknown[]>(
|
...sourcesAndConcurrencyAndScheduler: [...ObservableInputTuple<A>, number?, SchedulerLike?]
|
): Observable<A[number]>;
|
|
/**
|
* Creates an output Observable which concurrently emits all values from every
|
* given input Observable.
|
*
|
* <span class="informal">Flattens multiple Observables together by blending
|
* their values into one Observable.</span>
|
*
|
* 
|
*
|
* `merge` subscribes to each given input Observable (as arguments), and simply
|
* forwards (without doing any transformation) all the values from all the input
|
* Observables to the output Observable. The output Observable only completes
|
* once all input Observables have completed. Any error delivered by an input
|
* Observable will be immediately emitted on the output Observable.
|
*
|
* ## Examples
|
*
|
* Merge together two Observables: 1s interval and clicks
|
*
|
* ```ts
|
* import { merge, fromEvent, interval } from 'rxjs';
|
*
|
* const clicks = fromEvent(document, 'click');
|
* const timer = interval(1000);
|
* const clicksOrTimer = merge(clicks, timer);
|
* clicksOrTimer.subscribe(x => console.log(x));
|
*
|
* // Results in the following:
|
* // timer will emit ascending values, one every second(1000ms) to console
|
* // clicks logs MouseEvents to console every time the "document" is clicked
|
* // Since the two streams are merged you see these happening
|
* // as they occur.
|
* ```
|
*
|
* Merge together 3 Observables, but run only 2 concurrently
|
*
|
* ```ts
|
* import { interval, take, merge } from 'rxjs';
|
*
|
* const timer1 = interval(1000).pipe(take(10));
|
* const timer2 = interval(2000).pipe(take(6));
|
* const timer3 = interval(500).pipe(take(10));
|
*
|
* const concurrent = 2; // the argument
|
* const merged = merge(timer1, timer2, timer3, concurrent);
|
* merged.subscribe(x => console.log(x));
|
*
|
* // Results in the following:
|
* // - First timer1 and timer2 will run concurrently
|
* // - timer1 will emit a value every 1000ms for 10 iterations
|
* // - timer2 will emit a value every 2000ms for 6 iterations
|
* // - after timer1 hits its max iteration, timer2 will
|
* // continue, and timer3 will start to run concurrently with timer2
|
* // - when timer2 hits its max iteration it terminates, and
|
* // timer3 will continue to emit a value every 500ms until it is complete
|
* ```
|
*
|
* @see {@link mergeAll}
|
* @see {@link mergeMap}
|
* @see {@link mergeMapTo}
|
* @see {@link mergeScan}
|
*
|
* @param {...ObservableInput} observables Input Observables to merge together.
|
* @param {number} [concurrent=Infinity] Maximum number of input
|
* Observables being subscribed to concurrently.
|
* @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for managing
|
* concurrency of input Observables.
|
* @return {Observable} an Observable that emits items that are the result of
|
* every input Observable.
|
*/
|
export function merge(...args: (ObservableInput<unknown> | number | SchedulerLike)[]): Observable<unknown> {
|
const scheduler = popScheduler(args);
|
const concurrent = popNumber(args, Infinity);
|
const sources = args as ObservableInput<unknown>[];
|
return !sources.length
|
? // No source provided
|
EMPTY
|
: sources.length === 1
|
? // One source? Just return it.
|
innerFrom(sources[0])
|
: // Merge all sources
|
mergeAll(concurrent)(from(sources, scheduler));
|
}
|