From e19e104d011233d83bc10c37f1ee0b3ac6e15612 Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Wed, 5 May 2021 16:10:13 -0500 Subject: [PATCH] fix: Observable teardowns now properly called if `useDeprecatedSynchronousErrorHandling` is `true`. (#6365) Resolves an issue where teardowns returned by the Observable initializer were not being registered with the subscriber. Fixes #6364 --- spec/Observable-spec.ts | 18 ++++++++++++++++++ src/internal/Observable.ts | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spec/Observable-spec.ts b/spec/Observable-spec.ts index f13b1a2bfe..e62873f5a6 100644 --- a/spec/Observable-spec.ts +++ b/spec/Observable-spec.ts @@ -810,6 +810,24 @@ describe('Observable', () => { }).not.to.throw(); }); + it('should call teardown if sync unsubscribed', () => { + let called = false; + const observable = new Observable(() => () => (called = true)); + const subscription = observable.subscribe(); + subscription.unsubscribe(); + + expect(called).to.be.true; + }); + + it('should call registered teardowns if sync unsubscribed', () => { + let called = false; + const observable = new Observable((subscriber) => subscriber.add(() => called = true)); + const subscription = observable.subscribe(); + subscription.unsubscribe(); + + expect(called).to.be.true; + }); + afterEach(() => { config.useDeprecatedSynchronousErrorHandling = false; }); diff --git a/src/internal/Observable.ts b/src/internal/Observable.ts index 63d52b7843..cb0f7ce502 100644 --- a/src/internal/Observable.ts +++ b/src/internal/Observable.ts @@ -252,7 +252,7 @@ export class Observable implements Subscribable { subscriber.add(operator.call(subscriber, this.source)); } else { try { - this._subscribe(subscriber); + subscriber.add(this._subscribe(subscriber)); } catch (err) { localSubscriber.__syncError = err; }