diff --git a/spec/schedulers/AsapScheduler-spec.ts b/spec/schedulers/AsapScheduler-spec.ts index 54b55349eb..5ec0401753 100644 --- a/spec/schedulers/AsapScheduler-spec.ts +++ b/spec/schedulers/AsapScheduler-spec.ts @@ -288,4 +288,28 @@ describe('Scheduler.asap', () => { done(); }); }); + + it('scheduling inside of an executing action more than once should work', (done) => { + const results: any[] = []; + + let resolve: () => void; + let promise = new Promise((r) => resolve = r); + + asapScheduler.schedule(() => { + results.push(1) + asapScheduler.schedule(() => { + results.push(2); + }); + asapScheduler.schedule(() => { + results.push(3); + resolve(); + }); + }); + + promise.then(() => { + // This should always fire after two recursively scheduled microtasks. + expect(results).to.deep.equal([1, 2, 3]); + done(); + }); + }); }); diff --git a/src/internal/scheduler/AsapAction.ts b/src/internal/scheduler/AsapAction.ts index bd4b8697c3..178f677e90 100644 --- a/src/internal/scheduler/AsapAction.ts +++ b/src/internal/scheduler/AsapAction.ts @@ -35,7 +35,9 @@ export class AsapAction extends AsyncAction { const { actions } = scheduler; if (id != null && actions[actions.length - 1]?.id !== id) { immediateProvider.clearImmediate(id); - scheduler._scheduled = undefined; + if (scheduler._scheduled === id) { + scheduler._scheduled = undefined; + } } // Return undefined so the action knows to request a new async id if it's rescheduled. return undefined;