diff --git a/src/internal/operators/catchError.ts b/src/internal/operators/catchError.ts index a02f86befa..f90df6780e 100644 --- a/src/internal/operators/catchError.ts +++ b/src/internal/operators/catchError.ts @@ -153,7 +153,10 @@ class CatchSubscriber extends OuterSubscriber { this._unsubscribeAndRecycle(); const innerSubscriber = new InnerSubscriber(this, undefined, undefined); this.add(innerSubscriber); - subscribeToResult(this, result, undefined, undefined, innerSubscriber); + const innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + this.add(innerSubscription); + } } } } diff --git a/src/internal/operators/exhaustMap.ts b/src/internal/operators/exhaustMap.ts index acfeb5c089..b8aceadc82 100644 --- a/src/internal/operators/exhaustMap.ts +++ b/src/internal/operators/exhaustMap.ts @@ -122,10 +122,13 @@ class ExhaustMapSubscriber extends OuterSubscriber { } private _innerSub(result: ObservableInput, value: T, index: number): void { - const innerSubscriber = new InnerSubscriber(this, undefined, undefined); + const innerSubscriber = new InnerSubscriber(this, value, index); const destination = this.destination as Subscription; destination.add(innerSubscriber); - subscribeToResult(this, result, value, index, innerSubscriber); + const innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); + } } protected _complete(): void { diff --git a/src/internal/operators/mergeMap.ts b/src/internal/operators/mergeMap.ts index cf69688740..f23006874f 100644 --- a/src/internal/operators/mergeMap.ts +++ b/src/internal/operators/mergeMap.ts @@ -142,10 +142,13 @@ export class MergeMapSubscriber extends OuterSubscriber { } private _innerSub(ish: ObservableInput, value: T, index: number): void { - const innerSubscriber = new InnerSubscriber(this, undefined, undefined); + const innerSubscriber = new InnerSubscriber(this, value, index); const destination = this.destination as Subscription; destination.add(innerSubscriber); - subscribeToResult(this, ish, value, index, innerSubscriber); + const innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); + } } protected _complete(): void { diff --git a/src/internal/operators/mergeScan.ts b/src/internal/operators/mergeScan.ts index 7d12345e84..f1aa0c2332 100644 --- a/src/internal/operators/mergeScan.ts +++ b/src/internal/operators/mergeScan.ts @@ -103,10 +103,13 @@ export class MergeScanSubscriber extends OuterSubscriber { } private _innerSub(ish: any, value: T, index: number): void { - const innerSubscriber = new InnerSubscriber(this, undefined, undefined); + const innerSubscriber = new InnerSubscriber(this, value, index); const destination = this.destination as Subscription; destination.add(innerSubscriber); - subscribeToResult(this, ish, value, index, innerSubscriber); + const innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); + } } protected _complete(): void { diff --git a/src/internal/operators/onErrorResumeNext.ts b/src/internal/operators/onErrorResumeNext.ts index 2403770e6d..fb469dcdc0 100644 --- a/src/internal/operators/onErrorResumeNext.ts +++ b/src/internal/operators/onErrorResumeNext.ts @@ -162,7 +162,10 @@ class OnErrorResumeNextSubscriber extends OuterSubscriber { const innerSubscriber = new InnerSubscriber(this, undefined, undefined); const destination = this.destination as Subscription; destination.add(innerSubscriber); - subscribeToResult(this, next, undefined, undefined, innerSubscriber); + const innerSubscription = subscribeToResult(this, next, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); + } } else { this.destination.complete(); } diff --git a/src/internal/operators/skipUntil.ts b/src/internal/operators/skipUntil.ts index 3920f6f451..0e9df26b08 100644 --- a/src/internal/operators/skipUntil.ts +++ b/src/internal/operators/skipUntil.ts @@ -74,7 +74,11 @@ class SkipUntilSubscriber extends OuterSubscriber { const innerSubscriber = new InnerSubscriber(this, undefined, undefined); this.add(innerSubscriber); this.innerSubscription = innerSubscriber; - subscribeToResult(this, notifier, undefined, undefined, innerSubscriber); + const innerSubscription = subscribeToResult(this, notifier, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + this.add(innerSubscription); + this.innerSubscription = innerSubscription; + } } protected _next(value: T) { diff --git a/src/internal/operators/switchMap.ts b/src/internal/operators/switchMap.ts index 4c18328f99..9de2391ad2 100644 --- a/src/internal/operators/switchMap.ts +++ b/src/internal/operators/switchMap.ts @@ -133,10 +133,13 @@ class SwitchMapSubscriber extends OuterSubscriber { if (innerSubscription) { innerSubscription.unsubscribe(); } - const innerSubscriber = new InnerSubscriber(this, undefined, undefined); + const innerSubscriber = new InnerSubscriber(this, value, index); const destination = this.destination as Subscription; destination.add(innerSubscriber); - this.innerSubscription = subscribeToResult(this, result, value, index, innerSubscriber); + this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber); + if (this.innerSubscription !== innerSubscriber) { + destination.add(this.innerSubscription); + } } protected _complete(): void { diff --git a/src/internal/util/subscribeToResult.ts b/src/internal/util/subscribeToResult.ts index f350b85733..270660e0ec 100644 --- a/src/internal/util/subscribeToResult.ts +++ b/src/internal/util/subscribeToResult.ts @@ -10,20 +10,13 @@ export function subscribeToResult( result: any, outerValue?: T, outerIndex?: number, - destination?: Subscriber -): Subscription; -export function subscribeToResult( - outerSubscriber: OuterSubscriber, - result: any, - outerValue?: T, - outerIndex?: number, - destination: Subscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex) -): Subscription | void { + destination: Subscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex) +): Subscription | undefined { if (destination.closed) { return undefined; } if (result instanceof Observable) { return result.subscribe(destination); } - return subscribeTo(result)(destination); + return subscribeTo(result)(destination) as Subscription; }