我如何创建一个可以使用NodeJS暂停的计时器?
我在考虑使用setInterval / setTimeout,但不确定它是否能像我想要的那样工作? (因为没有“暂停”)
基本上我想要每5分钟重新启动一次计时器(例如)但是如果我做了某个动作,我希望它暂停,然后再做其他动作,取消暂停。
答案 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>
正如您所看到的,计时器以非常小的误差范围进行自我纠正。此外,它可以很容易地停止和重新启动。
希望有所帮助。