Я наткнувся на це, коли спробував автоматично вийти з користувача із сеансом, що минув. Моє рішення полягало в тому, щоб просто скинути час очікування через один день і зберегти функціональність для використання 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-бітний неподписаний int, пояснює цю поведінку. Дякую!