1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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
|