frontend/.pnpm-store/v3/files/ee/c1d806a8235128a66a6f0cc1bb9aebf6e12ca78f28ac45ad63770abb2097b236ef3b7240a815c4dcc36e7572d3652cfef031d62a7cbe4e66c97cd86faffa5f

61 lines
1.7 KiB
Plaintext

import { EmptyError } from '../util/EmptyError';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
/**
* If the source observable completes without emitting a value, it will emit
* an error. The error will be created at that time by the optional
* `errorFactory` argument, otherwise, the error will be {@link EmptyError}.
*
* ![](throwIfEmpty.png)
*
* ## Example
*
* Throw an error if the document wasn't clicked within 1 second
*
* ```ts
* import { fromEvent, takeUntil, timer, throwIfEmpty } from 'rxjs';
*
* const click$ = fromEvent(document, 'click');
*
* click$.pipe(
* takeUntil(timer(1000)),
* throwIfEmpty(() => new Error('The document was not clicked within 1 second'))
* )
* .subscribe({
* next() {
* console.log('The document was clicked');
* },
* error(err) {
* console.error(err.message);
* }
* });
* ```
*
* @param errorFactory A factory function called to produce the
* error to be thrown when the source observable completes without emitting a
* value.
* @return A function that returns an Observable that throws an error if the
* source Observable completed without emitting.
*/
export function throwIfEmpty<T>(errorFactory: () => any = defaultErrorFactory): MonoTypeOperatorFunction<T> {
return operate((source, subscriber) => {
let hasValue = false;
source.subscribe(
createOperatorSubscriber(
subscriber,
(value) => {
hasValue = true;
subscriber.next(value);
},
() => (hasValue ? subscriber.complete() : subscriber.error(errorFactory()))
)
);
});
}
function defaultErrorFactory() {
return new EmptyError();
}