diff --git a/spec/Observable-spec.ts b/spec/Observable-spec.ts index 665694ca88..f5cd8ad5f1 100644 --- a/spec/Observable-spec.ts +++ b/spec/Observable-spec.ts @@ -153,9 +153,9 @@ describe('Observable', () => { }, (err) => { results.push(err); - // Since the consuming code can no longer interfere with the synchronous - // producer, the remaining results are nexted. - expect(results).to.deep.equal([1, 2, 3, 4, expected]); + // The error should unsubscribe from the source, meaning we + // should not see the number 4. + expect(results).to.deep.equal([1, 2, 3, expected]); } ); }); diff --git a/src/internal/Observable.ts b/src/internal/Observable.ts index aca3a3add8..abab383605 100644 --- a/src/internal/Observable.ts +++ b/src/internal/Observable.ts @@ -313,21 +313,19 @@ export class Observable implements Subscribable { promiseCtor = getPromiseCtor(promiseCtor); return new promiseCtor((resolve, reject) => { - // Must be declared in a separate statement to avoid a ReferenceError when - // accessing subscription below in the closure due to Temporal Dead Zone. - let subscription: Subscription; - subscription = this.subscribe( - (value) => { + const subscriber = new SafeSubscriber({ + next: (value) => { try { next(value); } catch (err) { reject(err); - subscription?.unsubscribe(); + subscriber.unsubscribe(); } }, - reject, - resolve - ); + error: reject, + complete: resolve, + }); + this.subscribe(subscriber); }) as Promise; }