有没有一种优雅的方式来实现时钟更新事件?

时间:2014-05-27 16:15:44

标签: javascript events time

据我所知(而且我知道的相对较少),例如,没有发出的本机事件。秒针嘀嗒。我想出的最好的方法是反复检查 Date 对象(例如,每隔333ms;较短的间隔会导致更高的精度,但也会占用更多的资源)。不知何故,如果我反复使用相同的 Date 对象,时间不会更新,而

Date.prototype.getSeconds()

日志' NaN'虽然 typeof 是' number'。

    function clock(interval) {
    var d = new Date();
    var secondsOld = d.getSeconds();
    d = null;

    setInterval(function() {
        var d = new Date();
        var secondsNew = d.getSeconds();
        if ( secondsNew !== secondsOld ) {
            secondsOld = secondsNew;
            // trigger something
            console.log(secondsOld);
        }
        d = null;
    }, interval);
}

2 个答案:

答案 0 :(得分:5)

你是对的,因为没有本地时钟滴答事件。我能解决此问题的最佳效果是使用setTimeout()Date.now()

创建一个每秒调用setTimeout()的递归函数。确切地说,将超时设置为该函数调用的下一个确切秒数。这是一个例子。

// milliseconds per second
var SECOND = 1000;

function bindClockTick(callback) {
    function tick() {
        var now = Date.now();

        callback(now);

        setTimeout(tick, SECOND - (now % SECOND));
    }

    tick();
}

bindClockTick(function(ms) {
    console.log('tick! milliseconds: '+ ms);
});

这使用Date.now()而不是创建Date类的新实例。

这里有JSFiddle来测试精度。 该演示使用new Date()轻松显示当前时间,但只需几毫秒即可完成。

答案 1 :(得分:0)

我不确定你为什么要与确切的第二次更改同步;但是,我会这样做:

function clock() {
    var startMs = Date.now(),
        startSecs = Math.floor(startMs / 1000),
        firstOffset = 1000 - startMs % 1000;

    function tick () {
        var ms = Date.now(),
            secs = Math.floor(ms / 1000),
            dSecs = secs - startSecs;
        console.log(dSecs);
    }

    setTimeout(function () {
        tick();
        setInterval(tick, 1000);
    }, firstOffset);
    tick();
}
clock();

以下是发生的事情:

  1. 我使用Date.now()
  2. 以ms为单位获取当前时间
  3. 我知道在下一秒钟(firstOffset
  4. 之前有多少ms
  5. 我将初始setTimeout设置为此偏移量,确保它会在下一秒刻度时触发。
  6. 现在我们与第二个勾号同步,setInterval 1000毫秒将继续每秒更新。