blob: 249397058e55accc7ab00656f52bc02ed5381c4e [file] [log] [blame]
/** PURE_IMPORTS_START .._Subject,.._util_tryCatch,.._util_errorObject,.._OuterSubscriber,.._util_subscribeToResult PURE_IMPORTS_END */
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b)
if (b.hasOwnProperty(p))
d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
import { Subject } from '../Subject';
import { tryCatch } from '../util/tryCatch';
import { errorObject } from '../util/errorObject';
import { OuterSubscriber } from '../OuterSubscriber';
import { subscribeToResult } from '../util/subscribeToResult';
/**
* Returns an Observable that mirrors the source Observable with the exception of a `complete`. If the source
* Observable calls `complete`, this method will emit to the Observable returned from `notifier`. If that Observable
* calls `complete` or `error`, then this method will call `complete` or `error` on the child subscription. Otherwise
* this method will resubscribe to the source Observable.
*
* <img src="./img/repeatWhen.png" width="100%">
*
* @param {function(notifications: Observable): Observable} notifier - Receives an Observable of notifications with
* which a user can `complete` or `error`, aborting the repetition.
* @return {Observable} The source Observable modified with repeat logic.
* @method repeatWhen
* @owner Observable
*/
export function repeatWhen(notifier) {
return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
}
var RepeatWhenOperator = /*@__PURE__*/ (/*@__PURE__*/ function () {
function RepeatWhenOperator(notifier) {
this.notifier = notifier;
}
RepeatWhenOperator.prototype.call = function (subscriber, source) {
return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
};
return RepeatWhenOperator;
}());
/**
* We need this JSDoc comment for affecting ESDoc.
* @ignore
* @extends {Ignored}
*/
var RepeatWhenSubscriber = /*@__PURE__*/ (/*@__PURE__*/ function (_super) {
__extends(RepeatWhenSubscriber, _super);
function RepeatWhenSubscriber(destination, notifier, source) {
_super.call(this, destination);
this.notifier = notifier;
this.source = source;
this.sourceIsBeingSubscribedTo = true;
}
RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
this.sourceIsBeingSubscribedTo = true;
this.source.subscribe(this);
};
RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
if (this.sourceIsBeingSubscribedTo === false) {
return _super.prototype.complete.call(this);
}
};
RepeatWhenSubscriber.prototype.complete = function () {
this.sourceIsBeingSubscribedTo = false;
if (!this.isStopped) {
if (!this.retries) {
this.subscribeToRetries();
}
else if (this.retriesSubscription.closed) {
return _super.prototype.complete.call(this);
}
this._unsubscribeAndRecycle();
this.notifications.next();
}
};
RepeatWhenSubscriber.prototype._unsubscribe = function () {
var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
if (notifications) {
notifications.unsubscribe();
this.notifications = null;
}
if (retriesSubscription) {
retriesSubscription.unsubscribe();
this.retriesSubscription = null;
}
this.retries = null;
};
RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
var _a = this, notifications = _a.notifications, retries = _a.retries, retriesSubscription = _a.retriesSubscription;
this.notifications = null;
this.retries = null;
this.retriesSubscription = null;
_super.prototype._unsubscribeAndRecycle.call(this);
this.notifications = notifications;
this.retries = retries;
this.retriesSubscription = retriesSubscription;
return this;
};
RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
this.notifications = new Subject();
var retries = tryCatch(this.notifier)(this.notifications);
if (retries === errorObject) {
return _super.prototype.complete.call(this);
}
this.retries = retries;
this.retriesSubscription = subscribeToResult(this, retries);
};
return RepeatWhenSubscriber;
}(OuterSubscriber));
//# sourceMappingURL=repeatWhen.js.map