Süresi dolmuş bir oturumu olan bir kullanıcıyı otomatik olarak kapatmaya çalıştığımda buna rastladım. Çözümüm, bir gün sonra zaman aşımını sıfırlamak ve clearTimeout'u kullanmak için işlevselliği korumaktı.
İşte küçük bir prototip örneği:
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);
}
};
Kullanım:
var timer = new Timer('2018-08-17 14:05:00', function() {
document.location.reload();
});
Ve bunu şu yöntemle temizleyebilirsiniz stopTimer
:
timer.stopTimer();
delay >>> 0
olur, yani geçen gecikme sıfırdır. Her iki durumda da gecikmenin 32 bitlik işaretsiz int olarak saklanması bu davranışı açıklar. Teşekkürler!