defer

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

defer<O extends ObservableInput<any>>(observableFactory: () => O | void): Observable<ObservedValueOf<O>>

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<O>>: 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 allows you to create the Observable only when the Observer subscribes, and create a fresh Observable for each Observer. It waits until an Observer subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.

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