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` expects 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 access to an Observable | |
* | |
* ```ts | |
* import { iif, of, EMPTY } from 'rxjs'; | |
* | |
* let accessGranted; | |
* const observableIfYouHaveAccess = iif( | |
* () => accessGranted, | |
* of('It seems you have an access...'), | |
* EMPTY | |
* ); | |
* | |
* accessGranted = true; | |
* observableIfYouHaveAccess.subscribe({ | |
* next: value => console.log(value), | |
* complete: () => console.log('The end') | |
* }); | |
* | |
* // Logs: | |
* // 'It seems you have an access...' | |
* // 'The end' | |
* | |
* accessGranted = false; | |
* observableIfYouHaveAccess.subscribe({ | |
* next: value => console.log(value), | |
* complete: () => 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)); | |
} | |