From c69088a6c6d27fc811522f2025018a3a9464b7ea Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Wed, 23 Sep 2015 14:20:11 -0700 Subject: [PATCH] fix(Promises): escape promise error trap - ensures errors thrown in , and handlers under the of Promise-based observables will throw globally --- src/observables/PromiseObservable.ts | 12 ++++++++++-- src/util/subscribeToResult.ts | 6 +++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/observables/PromiseObservable.ts b/src/observables/PromiseObservable.ts index 5872ff67d7..143f43a6c4 100644 --- a/src/observables/PromiseObservable.ts +++ b/src/observables/PromiseObservable.ts @@ -31,7 +31,11 @@ export default class PromiseObservable extends Observable { this.value = value; subscriber.next(value); subscriber.complete(); - }, err => subscriber.error(err)); + }, err => subscriber.error(err)) + .then(null, err => { + // escape the promise trap, throw unhandled errors + setTimeout(() => { throw err; }) + }); } } else { let subscription = new Subscription(); @@ -43,7 +47,11 @@ export default class PromiseObservable extends Observable { this._isScalar = true; this.value = value; subscription.add(scheduler.schedule(dispatchNext, 0, { value, subscriber })) - }, err => subscription.add(scheduler.schedule(dispatchError, 0, { err, subscriber }))); + }, err => subscription.add(scheduler.schedule(dispatchError, 0, { err, subscriber }))) + .then(null, err => { + // escape the promise trap, throw unhandled errors + scheduler.schedule(() => { throw err; }) + });; } return subscription; } diff --git a/src/util/subscribeToResult.ts b/src/util/subscribeToResult.ts index 97a057cb40..2e9eb721e9 100644 --- a/src/util/subscribeToResult.ts +++ b/src/util/subscribeToResult.ts @@ -42,7 +42,11 @@ export default function subscribeToResult(outerSubscriber: OuterSubscriber destination.next(x); destination.complete(); } - }, err => destination.error(err)); + }, err => destination.error(err)) + .then(null, err => { + // Escaping the Promise trap: globally throw unhandled errors + setTimeout(() => { throw err; }); + }); return destination; } else if (typeof result[$$iterator] === 'function') { for(let item of result) {