W3cubDocs

/RxJS

exhaust

function stable

Converts a higher-order Observable into a first-order Observable by dropping inner Observables while the previous inner Observable has not yet completed.

exhaust<T>(): OperatorFunction<any, T>

Parameters

There are no parameters.

Returns

OperatorFunction<any, T>: An Observable that takes a source of Observables and propagates the first observable exclusively until it completes before subscribing to the next.

Description

Flattens an Observable-of-Observables by dropping the next inner Observables while the current inner is still executing.

exhaust marble diagram

exhaust subscribes to an Observable that emits Observables, also known as a higher-order Observable. Each time it observes one of these emitted inner Observables, the output Observable begins emitting the items emitted by that inner Observable. So far, it behaves like mergeAll. However, exhaust ignores every new inner Observable if the previous Observable has not yet completed. Once that one completes, it will accept and flatten the next inner Observable and repeat this process.

Example

Run a finite timer for each click, only if there is no currently active timer

import { fromEvent, interval } from 'rxjs';
import { exhaust, map, take } from 'rxjs/operators';

const clicks = fromEvent(document, 'click');
const higherOrder = clicks.pipe(
  map((ev) => interval(1000).pipe(take(5))),
);
const result = higherOrder.pipe(exhaust());
result.subscribe(x => console.log(x));

See Also

© 2015–2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors.
Code licensed under an Apache-2.0 License. Documentation licensed under CC BY 4.0.
https://rxjs.dev/api/operators/exhaust