我目前正在实现一个nodejs倒计时定时器。
我有一个客户端请求服务器维护的剩余时间(计时器),并且客户端也有一个倒计时计时器。
在实现客户端倒计时计时器时,我读了许多文章和建议,我们不应该在浏览器中使用setInterval
,因为它可能不准确。所以我用反应倒计时来测量准确的倒计时。
所以我也试着搜索哪种方法是最好的实现nodejs倒计时。但是stackoverflow中的许多答案都建议使用setInterval
。
在nodejs端使用setInterval是相当准确的吗?
提前感谢您的帮助。
setInterval()
和setTimeout()
一样,不能保证精确定时。它保证最小定时。在给定的延迟之后调用回调。但它可能会在延迟一段时间后被调用。如果你假设setInterval()
在正确的时间调用你的函数,你最终会得到运行缓慢的时钟。
您仍然可以使用setInterval()
构建计时器。但是不要将延迟用于计时,而是将其用作轮询间隔,而不是检查系统时钟。
:
const seconds = () => Math.floor(Date.now()/1000)
let then = seconds()
const started = then
function timer() {
const now = seconds()
if (then != now) { // We're in a new second.
console.log(now-started)
then = now
}
}
setInterval(timer, 100)
timer()
函数每秒运行10次。函数中的console.log()
每秒运行一次。
但这只是近似地发生。在正常情况下,显示下一个刻度需要1000毫秒多一点的时间,偶尔会有900毫秒的时间。但是,很容易花费更长的时间——甚至几秒钟——这取决于代码(或系统)中发生的其他事情。
作为一个例子,把这行放在上面的代码后面:
setTimeout(() => {while(seconds()-started < 5) {}}, 2000)
它将阻塞Node的事件循环,直到条件变为false。由于setInterval()
依赖于事件循环,timer()
错过了一堆秒。虽然这是一个任意的例子,但当其他事情正在进行时,事件循环被延迟是很常见的。
但这是一个非常罕见的需要。对于许多应用程序,setInterval()
绰绰有余。