import { concat } from '../observable/concat';
|
import { OperatorFunction, SchedulerLike, ValueFromArray } from '../types';
|
import { popScheduler } from '../util/args';
|
import { operate } from '../util/lift';
|
|
// Devs are more likely to pass null or undefined than they are a scheduler
|
// without accompanying values. To make things easier for (naughty) devs who
|
// use the `strictNullChecks: false` TypeScript compiler option, these
|
// overloads with explicit null and undefined values are included.
|
|
export function startWith<T>(value: null): OperatorFunction<T, T | null>;
|
export function startWith<T>(value: undefined): OperatorFunction<T, T | undefined>;
|
|
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
|
export function startWith<T, A extends readonly unknown[] = T[]>(
|
...valuesAndScheduler: [...A, SchedulerLike]
|
): OperatorFunction<T, T | ValueFromArray<A>>;
|
export function startWith<T, A extends readonly unknown[] = T[]>(...values: A): OperatorFunction<T, T | ValueFromArray<A>>;
|
|
/**
|
* Returns an observable that, at the moment of subscription, will synchronously emit all
|
* values provided to this operator, then subscribe to the source and mirror all of its emissions
|
* to subscribers.
|
*
|
* This is a useful way to know when subscription has occurred on an existing observable.
|
*
|
* <span class="informal">First emits its arguments in order, and then any
|
* emissions from the source.</span>
|
*
|
* 
|
*
|
* ## Examples
|
*
|
* Emit a value when a timer starts.
|
*
|
* ```ts
|
* import { timer, map, startWith } from 'rxjs';
|
*
|
* timer(1000)
|
* .pipe(
|
* map(() => 'timer emit'),
|
* startWith('timer start')
|
* )
|
* .subscribe(x => console.log(x));
|
*
|
* // results:
|
* // 'timer start'
|
* // 'timer emit'
|
* ```
|
*
|
* @param values Items you want the modified Observable to emit first.
|
* @return A function that returns an Observable that synchronously emits
|
* provided values before subscribing to the source Observable.
|
*
|
* @see {@link endWith}
|
* @see {@link finalize}
|
* @see {@link concat}
|
*/
|
export function startWith<T, D>(...values: D[]): OperatorFunction<T, T | D> {
|
const scheduler = popScheduler(values);
|
return operate((source, subscriber) => {
|
// Here we can't pass `undefined` as a scheduler, because if we did, the
|
// code inside of `concat` would be confused by the `undefined`, and treat it
|
// like an invalid observable. So we have to split it two different ways.
|
(scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
|
});
|
}
|