Tôi đã vấp phải điều này khi cố gắng tự động đăng xuất một người dùng có phiên hết hạn. Giải pháp của tôi là chỉ đặt lại thời gian chờ sau một ngày và giữ chức năng sử dụng clearTimeout.
Đây là một ví dụ nguyên mẫu nhỏ:
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);
}
};
Sử dụng:
var timer = new Timer('2018-08-17 14:05:00', function() {
document.location.reload();
});
Và bạn có thể xóa nó bằng stopTimer
phương pháp:
timer.stopTimer();
delay >>> 0
sẽ xảy ra, vì vậy độ trễ đã qua bằng không. Dù bằng cách nào, thực tế là độ trễ được lưu trữ dưới dạng int 32-bit không dấu giải thích hành vi này. Cảm ơn!