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; }