IE8 setInterval和setTimeout在49天的正常运行时间后立​​即触发

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"来检查正常运行时间.

有解决方法吗?

Cam*_*dan 5

你可以通过使用包装来解决这个问题 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保持之前已经过了足够时间验证校长.