From b157845a429027f209d8720ab368f63797490479 Mon Sep 17 00:00:00 2001 From: JiaLiPassion Date: Tue, 26 Mar 2024 02:37:34 +0000 Subject: [PATCH] fix(zone.js): make sure fakeasync use the same id pool with native Close #54323 fakeAsync should use the same timerId pool with native, so they will not conflict. --- .../zone.js/lib/zone-spec/fake-async-test.ts | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/zone.js/lib/zone-spec/fake-async-test.ts b/packages/zone.js/lib/zone-spec/fake-async-test.ts index 45d9096e757b97..a3d730ab01d717 100644 --- a/packages/zone.js/lib/zone-spec/fake-async-test.ts +++ b/packages/zone.js/lib/zone-spec/fake-async-test.ts @@ -66,11 +66,16 @@ let patchedTimers: { setInterval: typeof setInterval, clearTimeout: typeof clearTimeout, clearInterval: typeof clearInterval, + nativeSetTimeout: typeof setTimeout, + nativeClearTimeout: typeof clearTimeout, }|undefined; +const timeoutCallback = function() {}; + class Scheduler { // Next scheduler id. - public static nextId: number = 1; + public static nextNodeJSId: number = 1; + public static nextId: number = Scheduler.getNextId(); // Scheduler queue with the tuple of end time and callback function - sorted by end time. private _schedulerQueue: ScheduledFunction[] = []; @@ -83,6 +88,17 @@ class Scheduler { constructor() {} + static getNextId() { + const id = patchedTimers!.nativeSetTimeout.call(global, timeoutCallback, 0); + patchedTimers!.nativeClearTimeout.call(global, id); + if (typeof id === 'number') { + return id; + } + // in NodeJS, we just use a number for fakeAsync, since it will not + // conflict with native TimeoutId + return Scheduler.nextNodeJSId++; + } + getCurrentTickTime() { return this._currentTickTime; } @@ -116,7 +132,8 @@ class Scheduler { }, ...options }; - let currentId = options.id! < 0 ? Scheduler.nextId++ : options.id!; + let currentId = options.id! < 0 ? Scheduler.nextId : options.id!; + Scheduler.nextId = Scheduler.getNextId(); let endTime = this._currentTickTime + delay; // Insert so that scheduler queue remains sorted by end time. @@ -877,6 +894,8 @@ export function patchFakeAsyncTest(Zone: ZoneType): void { setTimeout: global.setTimeout, setInterval: global.setInterval, clearTimeout: global.clearTimeout, - clearInterval: global.clearInterval + clearInterval: global.clearInterval, + nativeSetTimeout: global[Zone.__symbol__('setTimeout')], + nativeClearTimeout: global[Zone.__symbol__('clearTimeout')], }; }