Javascript 设置间隔的最大延迟是多少?

Javascript 设置间隔的最大延迟是多少?,javascript,setinterval,Javascript,Setinterval,我在Firefox 15和Chrome 21上遇到以下代码问题: setInterval(function () { console.log('test') }, 300000000000) 在这两种浏览器上,函数都会立即运行,并且会快速重复。当然,这是一个很大的数字(表示从现在起大约10年),但我不希望它被视为一个微小的或负数。我没有看到任何文档中允许的最大延迟。有人知道是否有一个标准的最大值,或者这只是浏览器的有趣之处吗?我认为最大延迟是231-1,即2147483647ms。有符号32位

我在Firefox 15和Chrome 21上遇到以下代码问题:

setInterval(function () { console.log('test') }, 300000000000)

在这两种浏览器上,函数都会立即运行,并且会快速重复。当然,这是一个很大的数字(表示从现在起大约10年),但我不希望它被视为一个微小的或负数。我没有看到任何文档中允许的最大延迟。有人知道是否有一个标准的最大值,或者这只是浏览器的有趣之处吗?

我认为最大延迟是231-1,即2147483647ms。有符号32位整数的最大值(毫秒)。如果它是无符号的,它将是232-1=4294967295。

目前我找不到任何文档,但如果计时器值必须适合32位有符号整数,我不会感到惊讶。

间隔存储在有符号32位整数中(在测试的实现中:Google Chrome中的V8),因此您看到的行为是间隔溢出到负数的结果(在这种情况下,它的行为就像间隔是
0
)。因此,您可以使用的最大间隔是
2**31-1

以下是我如何确定情况是这样的:

setInterval(function(){console.log("hi");}, Math.pow(2,31));
其行为类似于间隔为
0

setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1);
没有在我愿意等待的时候开火

setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000);
其行为类似于间隔为
1000
(1秒)。在这里,
2**33
不影响前32位,因此我们只得到
1000


可能的最高间隔时间,
2**31-1ms
有点短于25天,因此对于任何合理的时间来说都足够了。

最大值为
2147483647
(231-1)

请注意,如果您将数字设置为大于该值,它将立即运行(想象您设置了负值,因此浏览器将无限循环运行)


如果您需要大于
2147483647
的间隔,下面是TypeScript中的一个示例,它允许您设置最大
458496310632933156516.92
天的间隔:

显然,我还没有测试过这种方法是否有效那么长时间:D


我怀疑这个数字可能会被强制转换成一个32位的整数…@Pointy,这可能是一个很好的猜测。嗯…:-/@Pointy。看起来2^31-1是安全的,但是2^31中断了,所以你几乎肯定是对的。如果你把这个作为一个答案,我会告诉你因果报应。不管代码是哪台机器,情况都是这样吗继续运行?“
setInterval
”的最大延迟时间是多少?”,2**32ms~50天。该特定实现中的间隔存储在..但+1中,用于显示所使用的方法。很好的示例测试。我在对问题本身的评论中基本上做了相同的细化,但用于显示您的工作的延迟时间是+1:)20亿1.47亿。这是正确的。setInterval()失败,值大于32位带符号整数。
setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y
export const setLongInterval = (callback: any, timeout: number, ...args: any): Timeout => {
    let count = 0;
    const MAX_32_BIT_SIGNED = 2147483647;
    const maxIterations = timeout / MAX_32_BIT_SIGNED;

    const onInterval = () => {
        ++count;
        if (count > maxIterations) {
            count = 0;
            callback(args);
        }
    };

    return setInterval(onInterval, Math.min(timeout, MAX_32_BIT_SIGNED));
};

export const setLongTimeout = (callback: any, timeout: number, ...args: any): Timeout => {
    let count = 0;
    let handle: Timeout;
    const MAX_32_BIT_SIGNED = 2147483647;
    const maxIterations = timeout / MAX_32_BIT_SIGNED;

    const onInterval = () => {
        ++count;
        if (count > maxIterations) {
            count = 0;
            clearInterval(handle);
            callback(args);
        }
    };

    handle = setInterval(onInterval, Math.min(timeout, MAX_32_BIT_SIGNED));
    return handle;
};