diff --git a/src/internal/Subscription.ts b/src/internal/Subscription.ts index ffdfb8ca113..552453bfdc2 100644 --- a/src/internal/Subscription.ts +++ b/src/internal/Subscription.ts @@ -40,6 +40,7 @@ export class Subscription implements SubscriptionLike { */ constructor(unsubscribe?: () => void) { if (unsubscribe) { + (this as any)._ctorUnsubscribe = true; (this as any)._unsubscribe = unsubscribe; } } @@ -57,7 +58,7 @@ export class Subscription implements SubscriptionLike { return; } - let { _parentOrParents, _unsubscribe, _subscriptions } = (this as any); + let { _parentOrParents, _ctorUnsubscribe, _unsubscribe, _subscriptions } = (this as any); this.closed = true; this._parentOrParents = null; @@ -76,12 +77,15 @@ export class Subscription implements SubscriptionLike { if (isFunction(_unsubscribe)) { // It's only possible to null _unsubscribe - to release the reference to - // any teardown function passed in the constructor - if it is actually an - // instance property, as there are some classes that are derived from - // Subscriber (which derives from Subscription) that implement an - // _unsubscribe method as a mechanism for obtaining unsubscription - // notifications and some of those subscribers are recycled. - if (this.hasOwnProperty('_unsubscribe')) { + // any teardown function passed in the constructor - if the property was + // actually assigned in the constructor, as there are some classes that + // are derived from Subscriber (which derives from Subscription) that + // implement an _unsubscribe method as a mechanism for obtaining + // unsubscription notifications and some of those subscribers are + // recycled. Also, in some of those subscribers, _unsubscribe switches + // from a prototype method to an instance property - see notifyNext in + // RetryWhenSubscriber. + if (_ctorUnsubscribe) { (this as any)._unsubscribe = undefined; } try {