背景:业务场景需要 1ms 级的定时器,在使用 setInterval 和 setTimeout 来做定时器后发现最小回调在 5ms 左右(可能有的机器要 10ms),不能满足业务需求。
使用 WebWorker 实现
已知 WebWorker 可以单独启一个线程,并且 WebWorker 中可以使用 perfomance 对象,在我们的目标浏览器上 perfomance.now() 是可以精确到 5 微妙级别的,以下代码实现了 1ms 的回调:
// callback worker
let start = performance.now();
const handleWhileCallback = () => {
while (true) {
let now = performance.now();
if (now - start >= 1) {
self.postMessage({
action: 'render_callback',
});
start = now;
}
}
};
handleWhileCallback();
// main
while_callback_worker.addEventListener('message', (message) => {
try {
const { action } = message.data;
switch (action) {
case 'render_callback':
// console.log('render_callback', performance.now());
// todo something
break;
default:
break;
}
} catch (error) {
// ignore
}
});
坏处
发现这样写完之后,cpu 的占用会有所上升,大佬们,还有什么其他思路呀!