Skip to content

Commit aafa7ff

Browse files
committed
fix(timer): multiple subscriptions to timer(Date) behaves correctly
- Moves the calculation of the due time to the subscription phase of the Observable - Adds a test confirming multiple subscriptions on delay fixes #3252
1 parent cfd846d commit aafa7ff

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

spec/observables/timer-spec.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import marbleTestingSignature = require('../helpers/marble-testing'); // tslint:disable-line:no-require-imports
2-
import { timer, never } from '../../src/create';
2+
import { timer, never, merge } from '../../src/create';
33
import { TestScheduler } from '../../src/testing';
4+
import { mergeMap } from '../../src/operators';
45

56
declare const asDiagram: any;
67
declare const time: typeof marbleTestingSignature.time;
78
declare const expectObservable: typeof marbleTestingSignature.expectObservable;
9+
declare const cold: typeof marbleTestingSignature.cold;
810
declare const rxTestScheduler: TestScheduler;
911

1012
/** @test {timer} */
@@ -89,4 +91,21 @@ describe('timer', () => {
8991
const values = { a: 0, b: 1, c: 2, d: 3, e: 4};
9092
expectObservable(source).toBe(expected, values);
9193
});
94+
95+
it('should still target the same date if a date is provided even for the ' +
96+
'second subscription', () => {
97+
const offset = time('----| ');
98+
const t1 = cold( 'a| ');
99+
const t2 = cold( '--a| ');
100+
const expected = '----(aa|)';
101+
102+
const dueTime = new Date(rxTestScheduler.now() + offset);
103+
const source = timer(dueTime, null, rxTestScheduler);
104+
105+
const testSource = merge(t1, t2).pipe(
106+
mergeMap(() => source)
107+
);
108+
109+
expectObservable(testSource).toBe(expected, {a: 0});
110+
});
92111
});

src/internal/observable/timer.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,15 @@ export function timer(dueTime: number | Date = 0,
6262
scheduler = async;
6363
}
6464

65-
const due = isNumeric(dueTime)
66-
? (dueTime as number)
67-
: (+dueTime - scheduler.now());
65+
return new Observable(subscriber => {
66+
const due = isNumeric(dueTime)
67+
? (dueTime as number)
68+
: (+dueTime - scheduler.now());
6869

69-
return new Observable(subscriber => scheduler.schedule(dispatch, due, {
70-
index: 0, period, subscriber
71-
}));
70+
return scheduler.schedule(dispatch, due, {
71+
index: 0, period, subscriber
72+
});
73+
});
7274
}
7375

7476
interface TimerState {

0 commit comments

Comments
 (0)