原来 web 端能够做到精准的定时器!!

516 阅读1分钟

背景:业务场景需要 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 的占用会有所上升,大佬们,还有什么其他思路呀!