123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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 args `ObservableInput`s to merge together. If the last parameter
- * is of type number, `merge` will use it to limit number of concurrently
- * subscribed `ObservableInput`s. If the last parameter is {@link SchedulerLike},
- * it will be used for scheduling the emission of values.
- * @return 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));
- }
|