use*_*806 10 settimeout setinterval internet-explorer-8
随着Windows系统接近49.7天的正常运行时间,内部Windows毫秒计时器接近2 ^ 32.在计算何时触发setInterval或setTimeout事件时,Internet Explorer 8中的错误似乎有算术溢出.例如,如果您在正常运行时间的第49天,并致电
setInterval(func, 86400000); // fire event in 24 hours
Run Code Online (Sandbox Code Playgroud)
将立即调用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);
}
Run Code Online (Sandbox Code Playgroud)
这仍然返回值,setTimeout如果没有遇到bug clearTimeout仍然可以使用.如果clearTimeout需要防弹或者你需要setInterval(并且可能clearInterval)你需要在问题上抛出更多代码,但是在执行func保持之前已经过了足够时间验证校长.
| 归档时间: |
|
| 查看次数: |
3888 次 |
| 最近记录: |