创建具有服务器同步功能的 javascript 计时器

Create javascript timer with server sync

提问人:Smith5727 提问时间:12/23/2020 更新时间:12/23/2020 访问量:318

问:

我想用每秒递增的 javascript 计时器显示当前时间(包括秒)。但是我不能相信系统时间,所以我想使用来自服务器的时间戳初始化 javascript 函数,然后只需将带有 setTimeout 的一秒添加到传递到函数的初始化时间戳中。然后我了解到 setTimeout 并不是很准确,所以时钟会在一段时间后显示几分钟的偏差。

因此,我的想法是每 60 秒将时间与提供初始时间戳的服务器同步。但后来我开始担心这会有很多内存泄漏,因为 setTimeout 方法实际上是递归的,我的建议方法在大图中看起来像这样:

function runClock(currentTime) {

    var now = new Date(Date.parse(currentTime));

   // 1. write now variable to some DOM element

   // 2. check if we need to sync time with server (counter variable or similar to see if approx 60sec has passed) 
   //   and if so do an $.ajax call to the server and update "now" variable with timestamp from the server

    t = setTimeout(function () {
        now.setSeconds(now.getSeconds() + 1);
        runClock(now);
    }, 1000);

}

谁能指导我这是否是正确的方法,如果是这样,请调整我的方法,这样它就不会因回调和递归而造成内存泄漏。

JavaScript AJAX 时间 计时器 回调

评论


答:

1赞 VeteranSlayer 12/23/2020 #1

实际上,我认为您的意思是方法.我认为您应该使用初始值为 1 的计数器。每次调用间隔方法后,计数器应增加 1,然后您可以检查计数器是否超过值 60,然后才进行 ajax 调用并重新启动 everythink。setInterval

它应该看起来像这样

var counter = 1;
var timer = 0;
yourAjaxCall();
var t = setInterval(function(){
    //do client side stuff with time

    //after you done check if time needs to be fetched from server {60 seconds passed}
    counter++;
    if(counter >= 60){
        counter = 1;
        yourAjaxCall();
    }
}, 1000);

function yourAjaxCall(){
    $.ajax({
        url: 'yoururl',
        type: 'post',
        success: function(response){
            timer = response;
        }
    });
}