UNPKG

@reactivex/rxjs

Version:

Reactive Extensions for modern JavaScript

153 lines 5.26 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); } return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var innerSubscribe_1 = require("../innerSubscribe"); /* tslint:enable:max-line-length */ /** * Catches errors on the observable to be handled by returning a new observable or throwing an error. * * ![](catch.png) * * ## Examples * Continues with a different Observable when there's an error * * ```ts * import { of } from 'rxjs'; * import { map, catchError } from 'rxjs/operators'; * * of(1, 2, 3, 4, 5).pipe( * map(n => { * if (n === 4) { * throw 'four!'; * } * return n; * }), * catchError(err => of('I', 'II', 'III', 'IV', 'V')), * ) * .subscribe(x => console.log(x)); * // 1, 2, 3, I, II, III, IV, V * ``` * * Retries the caught source Observable again in case of error, similar to retry() operator * * ```ts * import { of } from 'rxjs'; * import { map, catchError, take } from 'rxjs/operators'; * * of(1, 2, 3, 4, 5).pipe( * map(n => { * if (n === 4) { * throw 'four!'; * } * return n; * }), * catchError((err, caught) => caught), * take(30), * ) * .subscribe(x => console.log(x)); * // 1, 2, 3, 1, 2, 3, ... * ``` * * Throws a new error when the source Observable throws an error * * ```ts * import { of } from 'rxjs'; * import { map, catchError } from 'rxjs/operators'; * * of(1, 2, 3, 4, 5).pipe( * map(n => { * if (n === 4) { * throw 'four!'; * } * return n; * }), * catchError(err => { * throw 'error in source. Details: ' + err; * }), * ) * .subscribe( * x => console.log(x), * err => console.log(err) * ); * // 1, 2, 3, error in source. Details: four! * ``` * * @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. * @name catchError */ function catchError(selector) { return function catchErrorOperatorFunction(source) { var operator = new CatchOperator(selector); var caught = source.lift(operator); return (operator.caught = caught); }; } exports.catchError = catchError; var CatchOperator = /** @class */ (function () { function CatchOperator(selector) { this.selector = selector; } CatchOperator.prototype.call = function (subscriber, source) { return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); }; return CatchOperator; }()); /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ var CatchSubscriber = /** @class */ (function (_super) { __extends(CatchSubscriber, _super); function CatchSubscriber(destination, selector, caught) { var _this = _super.call(this, destination) || this; _this.selector = selector; _this.caught = caught; return _this; } // NOTE: overriding `error` instead of `_error` because we don't want // to have this flag this subscriber as `isStopped`. We can mimic the // behavior of the RetrySubscriber (from the `retry` operator), where // we unsubscribe from our source chain, reset our Subscriber flags, // then subscribe to the selector result. CatchSubscriber.prototype.error = function (err) { if (!this.isStopped) { var result = void 0; try { result = this.selector(err, this.caught); } catch (err2) { _super.prototype.error.call(this, err2); return; } this._unsubscribeAndRecycle(); var innerSubscriber = new innerSubscribe_1.SimpleInnerSubscriber(this); this.add(innerSubscriber); var innerSubscription = innerSubscribe_1.innerSubscribe(result, innerSubscriber); // The returned subscription will usually be the subscriber that was // passed. However, interop subscribers will be wrapped and for // unsubscriptions to chain correctly, the wrapper needs to be added, too. if (innerSubscription !== innerSubscriber) { this.add(innerSubscription); } } }; return CatchSubscriber; }(innerSubscribe_1.SimpleOuterSubscriber)); //# sourceMappingURL=catchError.js.map