From fd690a6c7821beb212daa241e8d5ae41165f5be7 Mon Sep 17 00:00:00 2001 From: Matthias Kunnen Date: Tue, 23 Apr 2019 05:14:59 +0200 Subject: [PATCH] fix(throttleTime): emit single value with trailing enabled (#4564) * test(throttleTime): test single value with trailing enabled Test if throttleTime emits when only a single value is emitted from the source with leading enabled/disabled and trailing enabled. * fix(throttleTime): fix single value with leading disabled, trailing enabled Emit single value with leading disabled, trailing enabled. Closes #2859 and #4491. * chore: improve test descriptions And remove an asDiagram call made with the same argument. Signed-off-by: Matthias Kunnen --- spec/operators/throttleTime-spec.ts | 32 +++++++++++++++++++++----- src/internal/operators/throttleTime.ts | 3 +++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/spec/operators/throttleTime-spec.ts b/spec/operators/throttleTime-spec.ts index fef0cd15b3..4e65054ae8 100644 --- a/spec/operators/throttleTime-spec.ts +++ b/spec/operators/throttleTime-spec.ts @@ -141,10 +141,10 @@ describe('throttleTime operator', () => { }); describe('throttleTime(fn, { leading: true, trailing: true })', () => { - asDiagram('throttleTime(fn, { leading: true, trailing: true })')('should immediately emit the first value in each time window', () => { + asDiagram('throttleTime(fn, { leading: true, trailing: true })')('should immediately emit the first and last values in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx--|'); const e1subs = '^ !'; - const t = time( '----| '); + const t = time( '----| '); const expected = '-a---y----b---x-c---x-|'; const result = e1.pipe(throttleTime(t, rxTestScheduler, { leading: true, trailing: true })); @@ -152,13 +152,23 @@ describe('throttleTime operator', () => { expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); }); + + it('should emit the value if only a single one is given', () => { + const e1 = hot('-a--------------------|'); + const t = time('----| '); + const expected = '-a--------------------|'; + + const result = e1.pipe(throttleTime(t, rxTestScheduler, { leading: true, trailing: true })); + + expectObservable(result).toBe(expected); + }); }); describe('throttleTime(fn, { leading: false, trailing: true })', () => { - asDiagram('throttleTime(fn, { leading: false, trailing: true })')('should immediately emit the first value in each time window', () => { + asDiagram('throttleTime(fn, { leading: false, trailing: true })')('should immediately emit the last value in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx--|'); const e1subs = '^ !'; - const t = time( '----| '); + const t = time( '----| '); const expected = '-----y--------x-----x-|'; const result = e1.pipe(throttleTime(t, rxTestScheduler, { leading: false, trailing: true })); @@ -167,10 +177,10 @@ describe('throttleTime operator', () => { expectSubscriptions(e1.subscriptions).toBe(e1subs); }); - asDiagram('throttleTime(fn, { leading: false, trailing: true })')('should emit the last throttled value when complete', () => { + it('should emit the last throttled value when complete', () => { const e1 = hot('-a-xy-----b--x--cxx|'); const e1subs = '^ !'; - const t = time('----| '); + const t = time('----| '); const expected = '-----y--------x----(x|)'; const result = e1.pipe(throttleTime(t, rxTestScheduler, { leading: false, trailing: true })); @@ -178,5 +188,15 @@ describe('throttleTime operator', () => { expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); }); + + it('should emit the value if only a single one is given', () => { + const e1 = hot('-a--------------------|'); + const t = time('----| '); + const expected = '-----a----------------|'; + + const result = e1.pipe(throttleTime(t, rxTestScheduler, { leading: false, trailing: true })); + + expectObservable(result).toBe(expected); + }); }); }); diff --git a/src/internal/operators/throttleTime.ts b/src/internal/operators/throttleTime.ts index 25cbf299d0..baed7785c2 100644 --- a/src/internal/operators/throttleTime.ts +++ b/src/internal/operators/throttleTime.ts @@ -133,6 +133,9 @@ class ThrottleTimeSubscriber extends Subscriber { this.add(this.throttled = this.scheduler.schedule>(dispatchNext, this.duration, { subscriber: this })); if (this.leading) { this.destination.next(value); + } else if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; } } }