fix(zone.js): make sure fakeasync use the same id pool with native (#54600)

Close #54323

fakeAsync should use the same timerId pool with native, so they will not
conflict.

PR Close #54600
This commit is contained in:
JiaLiPassion 2024-03-26 02:37:34 +00:00 committed by Dylan Hunn
parent 6d14fc52b9
commit ddbf6bb038

View file

@ -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 = -1;
// 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,10 @@ 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')],
};
Scheduler.nextId = Scheduler.getNextId();
}