NodeJS中可以使用的计时器?

时间:2015-03-17 02:29:21

标签: javascript node.js

我如何创建一个可以使用NodeJS暂停的计时器?

我在考虑使用setInterval / setTimeout,但不确定它是否能像我想要的那样工作? (因为没有“暂停”)

基本上我想要每5分钟重新启动一次计时器(例如)但是如果我做了某个动作,我希望它暂停,然后再做其他动作,取消暂停。

2 个答案:

答案 0 :(得分:1)

你不要在node.js中暂停一个计时器。相反,你启动和停止计时器。

如果你想以相同的剩余时间再次启动,如果它继续运行,那么你只需跟踪那段时间。

这里有一个让你启动和停止计时器的小物件的想法:

var Timer = function(t, fn, go) {
    var timer, tRemaining, tStarted;

    if (!t || !fn) {
        throw new Error("Must specify time and callback function");
    }

    tRemaining = t;

    if (go) {
        this.start();
    }

    this.start = function() {
        if (!timer) {
            tStarted = new Date().getTime();
            timer = setTimeout(fn, tRemaining);
        }
    };

    this.pause = function() {
        if (timer) {
            clearTimeout(timer);
            timer = null;
            var now = new Date().getTime();
            tRemaining -= now - tStarted;
        }
    }
}

// usage
var t = new Timer(5000, function() {
    // this will be called when the timer is done
});

t.start();

// some time later
t.pause();

// some time later
t.start();

答案 1 :(得分:0)

我很久以前在gist far far away中为delta timing创建了一个构造函数。可以在需要时启动,停止(暂停)和重新启动(恢复)名为DeltaTimer的构造函数。

以下是它的使用方法:

var output = $("output"), start;

var timer = new DeltaTimer(function (now) {
    output.innerHTML = (now - start) / 1000;
}, 1000);

$("start").addEventListener("click", function () {
    start = timer.start();
});

$("stop").addEventListener("click", timer.stop);

function $(id) {
    return document.getElementById(id);
}
<button id="start">Start</button>
<button id="stop">Stop</button>
<span id="output"></span>

<script>
function DeltaTimer(render, interval) {
    var timeout;
    var lastTime;
 
    this.start = start;
    this.stop = stop;
 
    function start() {
        timeout = setTimeout(loop, 0);
        lastTime = Date.now();
        return lastTime;
    }
 
    function stop() {
        clearTimeout(timeout);
        return lastTime;
    }
 
    function loop() {
        var thisTime = Date.now();
        var deltaTime = thisTime - lastTime;
        var delay = Math.max(interval - deltaTime, 0);
        timeout = setTimeout(loop, delay);
        lastTime = thisTime + delay;
        render(thisTime);
    }
}
</script>

正如您所看到的,计时器以非常小的误差范围进行自我纠正。此外,它可以很容易地停止和重新启动。

希望有所帮助。