defer

function stable

Creates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.

defer<R extends ObservableInput<any>>(observableFactory: () => R): Observable<ObservedValueOf<R>>

Parameters

observableFactory

The Observable factory function to invoke for each Observer that subscribes to the output Observable. May also return a Promise, which will be converted on the fly to an Observable.

Returns

Observable<ObservedValueOf<R>>: An Observable whose Observers' subscriptions trigger an invocation of the given Observable factory function.

Description

Creates the Observable lazily, that is, only when it is subscribed.

defer marble diagram

defer allows you to create an Observable only when the Observer subscribes. It waits until an Observer subscribes to it, calls the given factory function to get an Observable -- where a factory function typically generates a new Observable -- and subscribes the Observer to this Observable. In case the factory function returns a falsy value, then EMPTY is used as Observable instead. Last but not least, an exception during the factory function call is transferred to the Observer by calling error.

Example

Subscribe to either an Observable of clicks or an Observable of interval, at random

import { defer, fromEvent, interval } from 'rxjs';

const clicksOrInterval = defer(function () {
  return Math.random() > 0.5
    ? fromEvent(document, 'click')
    : interval(1000);
});
clicksOrInterval.subscribe(x => console.log(x));

// Results in the following behavior:
// If the result of Math.random() is greater than 0.5 it will listen
// for clicks anywhere on the "document"; when document is clicked it
// will log a MouseEvent object to the console. If the result is less
// than 0.5 it will emit ascending numbers, one every second(1000ms).

See Also

© 2015–2021 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/index/function/defer