我在ReactJS中构建了一个Pomodoro时钟,其中涉及使用setInterval
(或setTimeout
),但是当我运行它以遵循会话/中断模式时,我发现在我的手机时钟上进行了90分钟的会话,在我的Pomodoro应用中大约滞后了30分钟。也就是说,延迟了30分钟!
经过一番研究,我发现setInterval
并没有完全按照您指定的时间间隔触发,并且它会根据CPU负载而漂移,并且这些漂移会累积很长的时间运行。
我遇到的这个问题的一种解决方案是使用Date.now()
方法来解决递归setTimeout
函数中的漂移的自调整计时器。
但是,在此过程中,我还知道,当Google chrome中的标签页处于非活动状态时,由于CPU中调度进程的方式,即使是自调整计时器也会漂移(不活动的标签可能并不意味着过程)。
这对我来说是个问题,因为我想在一个选项卡中运行Pomodoro时钟,然后在另一个选项卡上工作。
我的问题是:如何解决这个无效的浏览器标签问题,以便在JavaScript中创建准确的计时器?