Javascript jQuery设置来自实时的间隔延迟

Javascript jQuery设置来自实时的间隔延迟,javascript,jquery,Javascript,Jquery,可以使setInterval与当前时间一起工作吗 我的意思是,我正在制作一个供个人使用的自定义倒计时库,我需要计算每一秒的倒数,但有时setInterval会因实时性而延迟,我认为这是因为浏览器延迟或执行时间。还是有其他更好的方法 my函数的执行时间示例,即使有1000毫秒,时间也可能不同: 开始:898,结束:898,执行时间:0索引。js:92 开始:898,结束:899,执行时间:1索引。js:92 开始:899,结束:900,执行时间:1索引。js:92 开始:900,结束:901,执行

可以使setInterval与当前时间一起工作吗

我的意思是,我正在制作一个供个人使用的自定义倒计时库,我需要计算每一秒的倒数,但有时setInterval会因实时性而延迟,我认为这是因为浏览器延迟或执行时间。还是有其他更好的方法

my函数的执行时间示例,即使有1000毫秒,时间也可能不同:

开始:898,结束:898,执行时间:0索引。js:92 开始:898,结束:899,执行时间:1索引。js:92 开始:899,结束:900,执行时间:1索引。js:92 开始:900,结束:901,执行时间:1索引。js:92 开始:904,结束:905,执行时间:1索引。js:92 开始:904,结束:905,执行时间:1索引。js:92 开始:905,结束:905,执行时间:0索引。js:92 开始:905,结束:905,执行时间:0索引。js:92 开始:906,结束:906,执行时间:0索引。js:92 开始:906,结束:907,执行时间:1索引。js:92 开始:892,结束:892,执行时间:0索引。js:92 开始:907,结束:907,执行时间:0索引。js:92 开始:907,结束:908,执行时间:1索引。js:92 开始:908,结束:908,执行时间:0索引。js:92 开始:908,结束:909,执行时间:1索引。js:92
开始:909,结束:910,执行时间:1索引。js:92

不要在开始时计算秒数,并尝试将数字每滴答减少一秒


相反,计算结束时间,然后在setInterval/setTimeout的每一个刻度上计算当前时间和结束时间之间的时间。

不要在开始时计算秒数,尝试每一个刻度减少一秒


相反,计算结束时间,然后在setInterval/setTimeout的每一个刻度上,可能应该是每秒一次以上,计算当前时间和结束时间之间的时间量。

如果浏览器中存在延迟问题,您可以设置webworker进行计时并在主页上触发某些事件


这是一个很大的开销,因为webworker非常昂贵,但可以帮助您解决问题。

如果浏览器中存在延迟问题,您可以设置webworker进行计时并在主页上触发某些事件



这是一个很大的开销,因为webworker非常昂贵,但可以帮助您解决问题。

只需使用333ms而不是1000 ms,如果需要,可以重新绘制。计时器并不精确。超时/间隔值只是最短等待时间,如果引擎已经繁忙,则可以进一步延迟或完全跳过间隔。您可以使用requestAnimationFrame创建一个更精确的计时器。@adeneo感谢您的建议,我们将尝试它。@Denees输出应该显示给我们什么?我认为你需要发布你的代码,这样我们才能更好地理解这个问题。只需使用333ms而不是1000 ms,如果需要,可以重新绘制。计时器并不精确。超时/间隔值只是最短等待时间,如果引擎已经繁忙,则可以进一步延迟或完全跳过间隔。您可以使用requestAnimationFrame创建一个更精确的计时器。@adeneo感谢您的建议,我们将尝试它。@Denees输出应该显示给我们什么?我认为你需要发布你的代码,这样我们才能更好地理解这个问题。仍然依赖于setTimeout/setInterval,容易出错delay@Ejay外卖是为了缩短间隔,使其每秒发射一次以上,并使用实际时间计算剩余时间。@Ejay每个滴答声可能会延迟,但随着时间的推移,它不会变得更不准确。我认为,除非有很多javascript在运行,否则在任何给定的时间,它都会在.1到.5秒内正确。@Ejay-基于浏览器的javascript中没有计时器永远不会出现延迟,因为JS是单线程的,计时器不会中断运行的代码。JasonP所建议的是您在JS中所能做的最好的事情。将间隔缩短到250ms,然后计算每个刻度的实际运行时间。这基本上是在浏览器JS中所能做到的最好的了。仍然依赖于setTimeout/setInterval,很容易出错delay@Ejay这样做的目的是缩短间隔,使其每秒触发一次以上,并使用实际时间计算剩余时间。@Ejay每个滴答声可能会延迟,但不会随着时间的推移变得更不准确。我认为,除非有很多javascript在运行,否则在任何给定的时间,它都会在.1到.5秒内正确。@Ejay-基于浏览器的javascript中没有计时器永远不会出现延迟,因为JS是单线程的,计时器不会中断运行的代码。JasonP所建议的是您在JS中所能做的最好的事情。将间隔缩短到250ms,然后计算每个刻度的实际运行时间。这基本上是在浏览器JS中所能做到的最好的了
在更新显示之前等待主执行线程可用,不是吗?webworker无法更新显示。它可以将消息发送回主线程。因此,主线程可以更新显示。在此更新过程中,主线程被阻止,传入消息被提示。如果是这样的话,你可以考虑在WebWork线程中进行计算。WebWork在更新显示之前仍然需要等待主执行线程可用,不是吗?WebWorver不能更新显示。它可以将消息发送回主线程。因此,主线程可以更新显示。在此更新过程中,主线程被阻止,传入消息被提示。如果是这种情况,你可以考虑在WebWork线程中进行计算。