From 9c8061da7712f38d74c7e790e1fc7d37d36e475a Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Wed, 3 May 2017 09:04:22 -0700 Subject: [PATCH] fix(delayWhen): correctly handle synchronous duration observable - closes #2587 --- spec/operators/delayWhen-spec.ts | 13 +++++++++++++ src/operator/delayWhen.ts | 11 +++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/spec/operators/delayWhen-spec.ts b/spec/operators/delayWhen-spec.ts index 850b98af84..50375bcf21 100644 --- a/spec/operators/delayWhen-spec.ts +++ b/spec/operators/delayWhen-spec.ts @@ -1,5 +1,6 @@ import * as Rx from '../../dist/cjs/Rx'; import marbleTestingSignature = require('../helpers/marble-testing'); // tslint:disable-line:no-require-imports +import { expect } from 'chai'; declare const { asDiagram }; declare const hot: typeof marbleTestingSignature.hot; @@ -215,4 +216,16 @@ describe('Observable.prototype.delayWhen', () => { expectSubscriptions(selector.subscriptions).toBe([]); expectSubscriptions(subDelay.subscriptions).toBe(subDelaySub); }); + + it('should complete when duration selector returns synchronous observable', () => { + let next: boolean = false; + let complete: boolean = false; + + Rx.Observable.of(1) + .delayWhen(() => Rx.Observable.of(2)) + .subscribe(() => next = true, null, () => complete = true); + + expect(next).to.be.true; + expect(complete).to.be.true; + }); }); \ No newline at end of file diff --git a/src/operator/delayWhen.ts b/src/operator/delayWhen.ts index af43e343d6..b272f2793f 100644 --- a/src/operator/delayWhen.ts +++ b/src/operator/delayWhen.ts @@ -56,7 +56,7 @@ export function delayWhen(this: Observable, delayDurationSelector: (value: subscriptionDelay?: Observable): Observable { if (subscriptionDelay) { return new SubscriptionDelayObservable(this, subscriptionDelay) - .lift(new DelayWhenOperator(delayDurationSelector)); + .lift(new DelayWhenOperator(delayDurationSelector)); } return this.lift(new DelayWhenOperator(delayDurationSelector)); } @@ -112,7 +112,7 @@ class DelayWhenSubscriber extends OuterSubscriber { this.tryDelay(delayNotifier, value); } } catch (err) { - this.destination.error(err); + this.destination.error(err); } } @@ -138,9 +138,12 @@ class DelayWhenSubscriber extends OuterSubscriber { private tryDelay(delayNotifier: Observable, value: T): void { const notifierSubscription = subscribeToResult(this, delayNotifier, value); - this.add(notifierSubscription); - this.delayNotifierSubscriptions.push(notifierSubscription); + if (notifierSubscription && !notifierSubscription.closed) { + this.add(notifierSubscription); + this.delayNotifierSubscriptions.push(notifierSubscription); + } + this.values.push(value); }