项目引擎是个V8魔改,引擎屏蔽了原生的js的计时函数setTimeout,只给了一个Schedule(sec , callback )
的延迟函数
因为react是基于 setTimeout, clearTimeout,做刷新的。我们写了polyfill
export const setTimeout = <TArgs extends any[]>(
callback: (...args: TArgs) => void,
timeout = 0,
...args: TArgs
): number => $.Schedule(timeout / 1000, () => callback(...args));
我们发现这些写造成了内存泄漏。怀疑这个函数是另一个线程的,并且没有回收。每次刷新页面会增加300多m内存,5-6次前端界面就崩了
我尝试过改成异步执行,效果也不好,内存占用更多了
export const setTimeout = <TArgs extends any[]>(
callback: (...args: TArgs) => void,
timeout = 0,
...args: TArgs
): number => {
timeout /= 1000;
const intervalId = getNextIntervalId();
new Promise((resolve) => {
$.Schedule(timeout, () => resolve?.(0))
}).then(() => callback(...args))
return intervalId
};
有没有全栈大佬给分析一下?