在 NodeJS 中可暂停的计时器

A timer that is pausable in NodeJS?

本文关键字:计时器 暂停 NodeJS      更新时间:2023-09-26

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

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

基本上,我想要每 5 分钟重复一次计时器(例如),但是如果我执行某个操作,我希望它暂停,然后在另一个操作上取消暂停。

您不会在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();
很久

以前,我在一个遥远的要点中创建了一个用于增量计时的构造函数。调用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>

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

希望有帮助。