diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index d5988bea..21f95b05 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -3282,6 +3282,12 @@ callbacks to execute _before_ running the next one. // // @return {!Promise} async function newMacrotask() { + if (NODE_JS) { + // setImmediate is generally faster than setTimeout in Node + // https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick#setimmediate-vs-settimeout + return new Promise(resolve => void setImmediate(resolve)); + } + // MessageChannel ensures that setTimeout is not throttled to 4ms. // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#reasons_for_delays_longer_than_specified // https://stackblitz.com/edit/stackblitz-starters-qtlpcc diff --git a/spec/core/ClockSpec.js b/spec/core/ClockSpec.js index 83b60570..ba5218d9 100644 --- a/spec/core/ClockSpec.js +++ b/spec/core/ClockSpec.js @@ -718,6 +718,20 @@ describe('Clock (acceptance)', function() { clock.uninstall(); }); + it('flushes microtask queue between macrotasks', async () => { + const log = []; + await new Promise(r => clock.setTimeout(r, 10)).then(() => { + log.push(1); + Promise.resolve().then(() => log.push(2)); + Promise.resolve().then(() => log.push(3)); + }); + await new Promise(r => clock.setTimeout(r, 10)).then(() => { + log.push(4); + Promise.resolve().then(() => log.push(5)); + }); + expect(log).toEqual([1, 2, 3, 4, 5]); + }); + it('can run setTimeouts/setIntervals asynchronously', function() { const recurring = jasmine.createSpy('recurring'), fn1 = jasmine.createSpy('fn1'), diff --git a/src/core/Clock.js b/src/core/Clock.js index f610c551..c537d069 100644 --- a/src/core/Clock.js +++ b/src/core/Clock.js @@ -226,6 +226,12 @@ callbacks to execute _before_ running the next one. // // @return {!Promise} async function newMacrotask() { + if (NODE_JS) { + // setImmediate is generally faster than setTimeout in Node + // https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick#setimmediate-vs-settimeout + return new Promise(resolve => void setImmediate(resolve)); + } + // MessageChannel ensures that setTimeout is not throttled to 4ms. // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#reasons_for_delays_longer_than_specified // https://stackblitz.com/edit/stackblitz-starters-qtlpcc