UNPKG

rxjs

Version:

Reactive Extensions for modern JavaScript

65 lines (62 loc) 2.09 kB
/** @prettier */ import { OperatorFunction } from '../types'; import { operate } from '../util/lift'; import { OperatorSubscriber } from './OperatorSubscriber'; /* tslint:disable:max-line-length */ export function defaultIfEmpty<T, R = T>(defaultValue?: R): OperatorFunction<T, T | R>; /* tslint:enable:max-line-length */ /** * Emits a given value if the source Observable completes without emitting any * `next` value, otherwise mirrors the source Observable. * * <span class="informal">If the source Observable turns out to be empty, then * this operator will emit a default value.</span> * * ![](defaultIfEmpty.png) * * `defaultIfEmpty` emits the values emitted by the source Observable or a * specified default value if the source Observable is empty (completes without * having emitted any `next` value). * * ## Example * If no clicks happen in 5 seconds, then emit "no clicks" * ```ts * import { fromEvent } from 'rxjs'; * import { defaultIfEmpty, takeUntil } from 'rxjs/operators'; * * const clicks = fromEvent(document, 'click'); * const clicksBeforeFive = clicks.pipe(takeUntil(interval(5000))); * const result = clicksBeforeFive.pipe(defaultIfEmpty('no clicks')); * result.subscribe(x => console.log(x)); * ``` * * @see {@link empty} * @see {@link last} * * @param {any} [defaultValue=null] The default value used if the source * Observable is empty. * @return {Observable} An Observable that emits either the specified * `defaultValue` if the source Observable emits no items, or the values emitted * by the source Observable. */ export function defaultIfEmpty<T, R>(defaultValue: R | null = null): OperatorFunction<T, T | R> { return operate((source, subscriber) => { let hasValue = false; source.subscribe( new OperatorSubscriber( subscriber, (value) => { hasValue = true; subscriber.next(value); }, undefined, () => { if (!hasValue) { subscriber.next(defaultValue!); } subscriber.complete(); } ) ); }); }