blob: 8f54dadd33d65c3a27923dfca58d7b0649a94d2f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import { tap } from './tap';
import { EmptyError } from '../util/EmptyError';
import { MonoTypeOperatorFunction } from '../types';
/**
* 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
* ```javascript
* import { fromEvent, timer } from 'rxjs';
* import { throwIfEmpty, takeUntil } from 'rxjs/operators';
*
* const click$ = fromEvent(button, 'click');
*
* clicks$.pipe(
* takeUntil(timer(1000)),
* throwIfEmpty(
* () => new Error('the button was not clicked within 1 second')
* ),
* )
* .subscribe({
* next() { console.log('The button was clicked'); },
* error(err) { console.error(err); },
* });
* ```
*
* @param {Function} [errorFactory] A factory function called to produce the
* error to be thrown when the source observable completes without emitting a
* value.
*/
export const throwIfEmpty =
<T>(errorFactory: (() => any) = defaultErrorFactory) => tap<T>({
hasValue: false,
next() { this.hasValue = true; },
complete() {
if (!this.hasValue) {
throw errorFactory();
}
}
} as any);
function defaultErrorFactory() {
return new EmptyError();
}
|