在nodejs服务器环境中使用setInterval是否安全?



我目前正在实现一个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()错过了一堆秒。虽然这是一个任意的例子,但当其他事情正在进行时,事件循环被延迟是很常见的。

在Node.js中,通常没有机制来保证计时器的准确性。或者,就此而言,任何运行在"常规"上的编程系统。Linux、Windows、MacOS等。对于这种功能,你需要运行一个RTOS,即使这样也有很多注意事项。

但这是一个非常罕见的需要。对于许多应用程序,setInterval()绰绰有余。

最新更新