UNPKG

rxjs

Version:

Reactive Extensions for modern JavaScript

86 lines (84 loc) 2.56 kB
import { Observable } from '../Observable'; import { defer } from './defer'; import { ObservableInput } from '../types'; /** * Checks a boolean at subscription time, and chooses between one of two observable sources * * `iif` excepts a function that returns a boolean (the `condition` function), and two sources, * the `trueResult` and the `falseResult`, and returns an Observable. * * At the moment of subscription, the `condition` function is called. If the result is `true`, the * subscription will be to the source passed as the `trueResult`, otherwise, the subscription will be * to the source passed as the `falseResult`. * * If you need to check more than two options to choose between more than one observable, have a look at the {@link defer} creation method. * * ## Examples * * ### Change at runtime which Observable will be subscribed * * ```ts * import { iif, of } from 'rxjs'; * * let subscribeToFirst; * const firstOrSecond = iif( * () => subscribeToFirst, * of('first'), * of('second'), * ); * * subscribeToFirst = true; * firstOrSecond.subscribe(value => console.log(value)); * * // Logs: * // "first" * * subscribeToFirst = false; * firstOrSecond.subscribe(value => console.log(value)); * * // Logs: * // "second" * * ``` * * ### Control an access to an Observable * * ```ts * let accessGranted; * const observableIfYouHaveAccess = iif( * () => accessGranted, * of('It seems you have an access...'), // Note that only one Observable is passed to the operator. * ); * * accessGranted = true; * observableIfYouHaveAccess.subscribe( * value => console.log(value), * err => {}, * () => console.log('The end'), * ); * * // Logs: * // "It seems you have an access..." * // "The end" * * accessGranted = false; * observableIfYouHaveAccess.subscribe( * value => console.log(value), * err => {}, * () => console.log('The end'), * ); * * // Logs: * // "The end" * ``` * * @see {@link defer} * * @param condition Condition which Observable should be chosen. * @param trueResult An Observable that will be subscribed if condition is true. * @param falseResult An Observable that will be subscribed if condition is false. * @return An observable that proxies to `trueResult` or `falseResult`, depending on the result of the `condition` function. */ export function iif<T, F>(condition: () => boolean, trueResult: ObservableInput<T>, falseResult: ObservableInput<F>): Observable<T | F> { return defer(() => (condition() ? trueResult : falseResult)); }