Tropecei nisso quando tentei fazer logout automático de um usuário com uma sessão expirada. Minha solução foi apenas zerar o tempo limite após um dia e manter a funcionalidade para usar o clearTimeout.
Aqui está um pequeno exemplo de protótipo:
Timer = function(execTime, callback) {
if(!(execTime instanceof Date)) {
execTime = new Date(execTime);
}
this.execTime = execTime;
this.callback = callback;
this.init();
};
Timer.prototype = {
callback: null,
execTime: null,
_timeout : null,
/**
* Initialize and start timer
*/
init : function() {
this.checkTimer();
},
/**
* Get the time of the callback execution should happen
*/
getExecTime : function() {
return this.execTime;
},
/**
* Checks the current time with the execute time and executes callback accordingly
*/
checkTimer : function() {
clearTimeout(this._timeout);
var now = new Date();
var ms = this.getExecTime().getTime() - now.getTime();
/**
* Check if timer has expired
*/
if(ms <= 0) {
this.callback(this);
return false;
}
/**
* Check if ms is more than one day, then revered to one day
*/
var max = (86400 * 1000);
if(ms > max) {
ms = max;
}
/**
* Otherwise set timeout
*/
this._timeout = setTimeout(function(self) {
self.checkTimer();
}, ms, this);
},
/**
* Stops the timeout
*/
stopTimer : function() {
clearTimeout(this._timeout);
}
};
Uso:
var timer = new Timer('2018-08-17 14:05:00', function() {
document.location.reload();
});
E você pode limpá-lo com o stopTimer
método:
timer.stopTimer();
delay >>> 0
acontece, então o atraso passado é zero. De qualquer forma, o fato de o atraso ser armazenado como um int sem sinal de 32 bits explica esse comportamento. Obrigado!