diff --git a/spec/operators/windowToggle-spec.ts b/spec/operators/windowToggle-spec.ts index a38e4a9a1f..f368f6c5e5 100644 --- a/spec/operators/windowToggle-spec.ts +++ b/spec/operators/windowToggle-spec.ts @@ -407,4 +407,22 @@ describe('Observable.prototype.windowToggle', () => { expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); + + it ('should handle empty closing observable', () => { + const e1 = hot('--a--^---b---c---d---e---f---g---h------|'); + const e1subs = '^ !'; + const e2 = cold( '---o---------------o-----------| '); + const e2subs = '^ ! '; + const e3 = Observable.empty(); + const expected = '---x---------------y---------------|'; + const x = cold( '|'); + const y = cold( '|'); + const values = { x: x, y: y }; + + const result = e1.windowToggle(e2, () => e3); + + expectObservable(result).toBe(expected, values); + expectSubscriptions(e1.subscriptions).toBe(e1subs); + expectSubscriptions(e2.subscriptions).toBe(e2subs); + }); }); \ No newline at end of file diff --git a/src/operator/windowToggle.ts b/src/operator/windowToggle.ts index cf9b05be4e..e27d3086a7 100644 --- a/src/operator/windowToggle.ts +++ b/src/operator/windowToggle.ts @@ -131,10 +131,16 @@ class WindowToggleSubscriber extends OuterSubscriber { const context = { window, subscription }; this.contexts.push(context); const innerSubscription = subscribeToResult(this, closingNotifier, context); - ( innerSubscription).context = context; - subscription.add(innerSubscription); + + if (innerSubscription.isUnsubscribed) { + this.closeWindow(this.contexts.length - 1); + } else { + ( innerSubscription).context = context; + subscription.add(innerSubscription); + } this.destination.next(window); + } } else { this.closeWindow(this.contexts.indexOf(outerValue)); @@ -151,7 +157,11 @@ class WindowToggleSubscriber extends OuterSubscriber { } } - closeWindow(index: number) { + private closeWindow(index: number): void { + if (index === -1) { + return; + } + const { contexts } = this; const context = contexts[index]; const { window, subscription } = context;