Me encontré con esto cuando intenté cerrar la sesión automáticamente de un usuario con una sesión caducada. Mi solución fue restablecer el tiempo de espera después de un día y mantener la funcionalidad para usar clearTimeout.
Aquí hay un pequeño ejemplo de prototipo:
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();
});
Y puedes borrarlo con el stopTimer
método:
timer.stopTimer();
delay >>> 0
sucede algo como , por lo que el retraso pasado es cero. De cualquier manera, el hecho de que el retraso se almacene como un int sin firmar de 32 bits explica este comportamiento. ¡Gracias!