Я наткнулся на это, когда попытался автоматически выйти из системы пользователя с истекшим сеансом. Мое решение заключалось в том, чтобы просто сбросить тайм-аут через один день и сохранить функциональность для использования clearTimeout.
Вот небольшой пример прототипа:
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);
}
};
Использование:
var timer = new Timer('2018-08-17 14:05:00', function() {
document.location.reload();
});
И вы можете очистить это с помощью stopTimer
метода:
timer.stopTimer();
delay >>> 0
происходит что-то вроде этого , поэтому пройденная задержка равна нулю. В любом случае, это поведение объясняется тем фактом, что задержка хранится как 32-битное целое число без знака. Спасибо!