diff --git a/src/operator/windowToggle.ts b/src/operator/windowToggle.ts index 5c108c7ce2..866e68eb7c 100644 --- a/src/operator/windowToggle.ts +++ b/src/operator/windowToggle.ts @@ -18,7 +18,7 @@ class WindowToggleOperator implements Operator { private closingSelector: (openValue: O) => Observable) { } - call(subscriber: Subscriber): Subscriber { + call(subscriber: Subscriber>): Subscriber { return new WindowToggleSubscriber( subscriber, this.openings, this.closingSelector ); @@ -33,7 +33,7 @@ interface WindowContext { class WindowToggleSubscriber extends Subscriber { private contexts: Array> = []; - constructor(destination: Subscriber, + constructor(protected destination: Subscriber>, private openings: Observable, private closingSelector: (openValue: O) => Observable) { super(destination); @@ -72,24 +72,29 @@ class WindowToggleSubscriber extends Subscriber { if (closingNotifier === errorObject) { this.error(closingNotifier.e); } else { - let context = { - window: new Subject(), - subscription: new Subscription() - }; + const destination = this.destination; + const window = new Subject(); + const subscription = new Subscription(); + const context = { window, subscription }; this.contexts.push(context); - this.destination.next(context.window); const subscriber = new WindowClosingNotifierSubscriber(this, context); - const subscription = closingNotifier._subscribe(subscriber); - this.add(context.subscription.add(subscription)); + const closingSubscription = closingNotifier._subscribe(subscriber); + subscription.add(closingSubscription); + destination.add(subscription); + destination.add(window); + destination.next(window); } } closeWindow(context: WindowContext) { const { window, subscription } = context; const contexts = this.contexts; + const destination = this.destination; + contexts.splice(contexts.indexOf(context), 1); window.complete(); - this.remove(subscription); + destination.remove(subscription); + destination.remove(window); subscription.unsubscribe(); } }