UNPKG

@acutmore/rxjs

Version:

Reactive Extensions for modern JavaScript

158 lines 6.33 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var 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 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 root_1 = require("..//util/root"); var Observable_1 = require("../Observable"); /** * We need this JSDoc comment for affecting ESDoc. * @extends {Ignored} * @hide true */ var PromiseObservable = /** @class */ (function (_super) { __extends(PromiseObservable, _super); function PromiseObservable(promise, scheduler) { var _this = _super.call(this) || this; _this.promise = promise; _this.scheduler = scheduler; // youView-specific memory leak fix _this.__isError = false; return _this; } /** * Converts a Promise to an Observable. * * <span class="informal">Returns an Observable that just emits the Promise's * resolved value, then completes.</span> * * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an * Observable. If the Promise resolves with a value, the output Observable * emits that resolved value as a `next`, and then completes. If the Promise * is rejected, then the output Observable emits the corresponding Error. * * @example <caption>Convert the Promise returned by Fetch to an Observable</caption> * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/')); * result.subscribe(x => console.log(x), e => console.error(e)); * * @see {@link bindCallback} * @see {@link from} * * @param {PromiseLike<T>} promise The promise to be converted. * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling * the delivery of the resolved value (or the rejection). * @return {Observable<T>} An Observable which wraps the Promise. * @static true * @name fromPromise * @owner Observable */ PromiseObservable.create = function (promise, scheduler) { return new PromiseObservable(promise, scheduler); }; PromiseObservable.prototype._subscribe = function (subscriber) { var _this = this; var promise = this.promise; var scheduler = this.scheduler; if (scheduler == null) { if (this._isScalar) { if (!subscriber.closed) { subscriber.next(this.value); subscriber.complete(); } } else if (this.__isError) { // youView-specific memory leak fix if (!subscriber.closed) { subscriber.error(this.__error); } } else { promise.then(function (value) { // youView-specific memory leak fix _this.promise = null; _this.value = value; _this._isScalar = true; if (!subscriber.closed) { subscriber.next(value); subscriber.complete(); } }, function (err) { // youView-specific memory leak fix _this.promise = null; _this.__isError = true; _this.__error = err; if (!subscriber.closed) { subscriber.error(err); } }) .then(null, function (err) { // escape the promise trap, throw unhandled errors root_1.root.setTimeout(function () { throw err; }); }); // youView-specific memory leak fix promise = null; } } else { if (this._isScalar) { if (!subscriber.closed) { return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber }); } } else if (this.__isError) { // youView-specific memory leak fix if (!subscriber.closed) { return scheduler.schedule(dispatchError, 0, { err: this.__error, subscriber: subscriber }); } } else { promise.then(function (value) { // youView-specific memory leak fix _this.promise = null; _this.value = value; _this._isScalar = true; if (!subscriber.closed) { subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber })); } }, function (err) { // youView-specific memory leak fix _this.promise = null; _this.__isError = true; _this.__error = err; if (!subscriber.closed) { subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber })); } }) .then(null, function (err) { // escape the promise trap, throw unhandled errors root_1.root.setTimeout(function () { throw err; }); }); // youView-specific memory leak fix promise = null; } } }; return PromiseObservable; }(Observable_1.Observable)); exports.PromiseObservable = PromiseObservable; function dispatchNext(arg) { var value = arg.value, subscriber = arg.subscriber; if (!subscriber.closed) { subscriber.next(value); subscriber.complete(); } } function dispatchError(arg) { var err = arg.err, subscriber = arg.subscriber; if (!subscriber.closed) { subscriber.error(err); } } //# sourceMappingURL=PromiseObservable.js.map