Skip to content

Commit c69088a

Browse files
committed
fix(Promises): escape promise error trap
- ensures errors thrown in , and handlers under the of Promise-based observables will throw globally
1 parent cb393dc commit c69088a

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

src/observables/PromiseObservable.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ export default class PromiseObservable<T> extends Observable<T> {
3131
this.value = value;
3232
subscriber.next(value);
3333
subscriber.complete();
34-
}, err => subscriber.error(err));
34+
}, err => subscriber.error(err))
35+
.then(null, err => {
36+
// escape the promise trap, throw unhandled errors
37+
setTimeout(() => { throw err; })
38+
});
3539
}
3640
} else {
3741
let subscription = new Subscription();
@@ -43,7 +47,11 @@ export default class PromiseObservable<T> extends Observable<T> {
4347
this._isScalar = true;
4448
this.value = value;
4549
subscription.add(scheduler.schedule(dispatchNext, 0, { value, subscriber }))
46-
}, err => subscription.add(scheduler.schedule(dispatchError, 0, { err, subscriber })));
50+
}, err => subscription.add(scheduler.schedule(dispatchError, 0, { err, subscriber })))
51+
.then(null, err => {
52+
// escape the promise trap, throw unhandled errors
53+
scheduler.schedule(() => { throw err; })
54+
});;
4755
}
4856
return subscription;
4957
}

src/util/subscribeToResult.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ export default function subscribeToResult<T, R>(outerSubscriber: OuterSubscriber
4242
destination.next(x);
4343
destination.complete();
4444
}
45-
}, err => destination.error(err));
45+
}, err => destination.error(err))
46+
.then(null, err => {
47+
// Escaping the Promise trap: globally throw unhandled errors
48+
setTimeout(() => { throw err; });
49+
});
4650
return destination;
4751
} else if (typeof result[$$iterator] === 'function') {
4852
for(let item of result) {

0 commit comments

Comments
 (0)