setInterval的最大延迟是多少?

时间:2012-09-28 04:03:50

标签: javascript setinterval

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

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

在两个浏览器上,该功能立即运行很快重复。当然,这是一个很大的数字(代表从现在开始大约10年),但我不认为它被视为微小或负数。我没有看到任何文档中允许的最大延迟。有没有人知道是否有标准最大值,或者这只是浏览器有趣吗?

5 个答案:

答案 0 :(得分:22)

间隔存储在带符号的32位int中(在测试的实现中: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(一秒)。在这里,2**33不影响前32位,因此我们得到1000

最高可能的间隔2**31-1ms有点害羞25天,所以对于任何合理的事情都是绰绰有余。

答案 1 :(得分:12)

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

答案 2 :(得分:4)

我认为最大延迟是2 31 -1,即2,147,483,647ms。带符号的32位整数的最大值,以ms为单位。如果它是无符号的,则为2 32 -1 = 4,294,967,295。

答案 3 :(得分:1)

如果您需要一个大于 2,147,483,647 的间隔,这里是 TypeScript 中的一个示例,它允许您将间隔设置为最多 458,496,310,632,933,156,516.92 天:

显然,我还没有测试过它可以持续这么长时间:D。

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;
};

答案 4 :(得分:0)

Max是2,147,483,647(2 31 -1)

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

setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y