60 lines
2.3 KiB
JavaScript
60 lines
2.3 KiB
JavaScript
|
"use strict";
|
||
|
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 __());
|
||
|
};
|
||
|
var Subscriber_1 = require('../Subscriber');
|
||
|
/**
|
||
|
* Catches errors on the observable to be handled by returning a new observable or throwing an error.
|
||
|
* @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
|
||
|
* is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
|
||
|
* is returned by the `selector` will be used to continue the observable chain.
|
||
|
* @return {Observable} an observable that originates from either the source or the observable returned by the
|
||
|
* catch `selector` function.
|
||
|
*/
|
||
|
function _catch(selector) {
|
||
|
var operator = new CatchOperator(selector);
|
||
|
var caught = this.lift(operator);
|
||
|
return (operator.caught = caught);
|
||
|
}
|
||
|
exports._catch = _catch;
|
||
|
var CatchOperator = (function () {
|
||
|
function CatchOperator(selector) {
|
||
|
this.selector = selector;
|
||
|
}
|
||
|
CatchOperator.prototype.call = function (subscriber) {
|
||
|
return new CatchSubscriber(subscriber, this.selector, this.caught);
|
||
|
};
|
||
|
return CatchOperator;
|
||
|
}());
|
||
|
var CatchSubscriber = (function (_super) {
|
||
|
__extends(CatchSubscriber, _super);
|
||
|
function CatchSubscriber(destination, selector, caught) {
|
||
|
_super.call(this, destination);
|
||
|
this.selector = selector;
|
||
|
this.caught = caught;
|
||
|
}
|
||
|
// NOTE: overriding `error` instead of `_error` because we don't want
|
||
|
// to have this flag this subscriber as `isStopped`.
|
||
|
CatchSubscriber.prototype.error = function (err) {
|
||
|
if (!this.isStopped) {
|
||
|
var result = void 0;
|
||
|
try {
|
||
|
result = this.selector(err, this.caught);
|
||
|
}
|
||
|
catch (err) {
|
||
|
this.destination.error(err);
|
||
|
return;
|
||
|
}
|
||
|
this._innerSub(result);
|
||
|
}
|
||
|
};
|
||
|
CatchSubscriber.prototype._innerSub = function (result) {
|
||
|
this.unsubscribe();
|
||
|
this.destination.remove(this);
|
||
|
result.subscribe(this.destination);
|
||
|
};
|
||
|
return CatchSubscriber;
|
||
|
}(Subscriber_1.Subscriber));
|
||
|
//# sourceMappingURL=catch.js.map
|