Skip to content

Commit

Permalink
fix(scheduler): prevent unwanted clearInterval
Browse files Browse the repository at this point in the history
In AsyncAction, this.pending was assigned before the call to
recycleAsyncId. That prevented the interval from being re-used resulting
in the interval being cleared and re-created for each notification.

Closes ReactiveX#3042
  • Loading branch information
cartant committed Nov 12, 2017
1 parent 81bfe55 commit 03d0f9f
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 6 deletions.
6 changes: 4 additions & 2 deletions spec/schedulers/AsapScheduler-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ describe('Scheduler.asap', () => {
it('should reuse the interval for recursively scheduled actions with the same delay', () => {
const sandbox = sinon.sandbox.create();
const fakeTimer = sandbox.useFakeTimers();
const stubSetInterval = sinon.stub(global, 'setInterval').callThrough();
// callThrough is missing from the declarations installed by the typings tool in stable
const stubSetInterval = (<any> sinon.stub(global, 'setInterval')).callThrough();
function dispatch(state: any): void {
state.index += 1;
if (state.index < 3) {
Expand All @@ -68,7 +69,8 @@ describe('Scheduler.asap', () => {
it('should not reuse the interval for recursively scheduled actions with a different delay', () => {
const sandbox = sinon.sandbox.create();
const fakeTimer = sandbox.useFakeTimers();
const stubSetInterval = sinon.stub(global, 'setInterval').callThrough();
// callThrough is missing from the declarations installed by the typings tool in stable
const stubSetInterval = (<any> sinon.stub(global, 'setInterval')).callThrough();
function dispatch(state: any): void {
state.index += 1;
state.period -= 1;
Expand Down
8 changes: 4 additions & 4 deletions src/scheduler/AsyncAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,6 @@ export class AsyncAction<T> extends Action<T> {
// Always replace the current state with the new state.
this.state = state;

// Set the pending flag indicating that this action has been scheduled, or
// has recursively rescheduled itself.
this.pending = true;

const id = this.id;
const scheduler = this.scheduler;

Expand Down Expand Up @@ -61,6 +57,10 @@ export class AsyncAction<T> extends Action<T> {
this.id = this.recycleAsyncId(scheduler, id, delay);
}

// Set the pending flag indicating that this action has been scheduled, or
// has recursively rescheduled itself.
this.pending = true;

this.delay = delay;
// If this action has already an async Id, don't request a new one.
this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
Expand Down

0 comments on commit 03d0f9f

Please sign in to comment.