随着 Windows 系统的正常运行时间接近 49.7 天,内部 Windows 毫秒滴答计数器接近 2^32。
在计算何时触发 setInterval 或 setTimeout 事件时,Internet Explorer 8 中的一个错误似乎存在算术溢出。例如,如果您在正常运行时间的第 49 天,并调用
setInterval(func, 86400000); // fire event in 24 hours
func 将立即被调用,而不是在 24 小时内。
如果将足够大的数字传递给 setInterval 或 setTimeout,则此错误可能会在 25 天正常运行时间(2^31 毫秒)后的任何时间发生。 (不过,我只在第 49 天检查过。)
您可以通过在命令行中输入“net statistics server”来查看正常运行天数。
有解决方法吗?
最佳答案
您可以通过使用 setTimeout
的包装器来解决该错误。
function setSafeTimeout(func, delay){
var target = +new Date + delay;
return setTimeout(function(){
var now = +new Date;
if(now < target) {
setSafeTimeout(func, target - now);
} else {
func();
}
}, delay);
}
这仍然返回
setTimeout
的值所以如果没有遇到这个bug clearTimeout
仍然可以使用。如果 clearTimeout
需要防弹或者你需要setInterval
(大概是 clearInterval
)您需要在问题上抛出更多代码,但是在执行 func
之前验证足够时间的原则已经过去。持有。
关于internet-explorer-8 - IE8 setInterval 和 setTimeout 在正常运行 49 天后立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4351191/