retry.js
2.58 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
import { timer } from '../observable/timer';
import { innerFrom } from '../observable/innerFrom';
export function retry(configOrCount = Infinity) {
let config;
if (configOrCount && typeof configOrCount === 'object') {
config = configOrCount;
}
else {
config = {
count: configOrCount,
};
}
const { count = Infinity, delay, resetOnSuccess: resetOnSuccess = false } = config;
return count <= 0
? identity
: operate((source, subscriber) => {
let soFar = 0;
let innerSub;
const subscribeForRetry = () => {
let syncUnsub = false;
innerSub = source.subscribe(createOperatorSubscriber(subscriber, (value) => {
if (resetOnSuccess) {
soFar = 0;
}
subscriber.next(value);
}, undefined, (err) => {
if (soFar++ < count) {
const resub = () => {
if (innerSub) {
innerSub.unsubscribe();
innerSub = null;
subscribeForRetry();
}
else {
syncUnsub = true;
}
};
if (delay != null) {
const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(err, soFar));
const notifierSubscriber = createOperatorSubscriber(subscriber, () => {
notifierSubscriber.unsubscribe();
resub();
}, () => {
subscriber.complete();
});
notifier.subscribe(notifierSubscriber);
}
else {
resub();
}
}
else {
subscriber.error(err);
}
}));
if (syncUnsub) {
innerSub.unsubscribe();
innerSub = null;
subscribeForRetry();
}
};
subscribeForRetry();
});
}
//# sourceMappingURL=retry.js.map