24

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

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

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

4

6 回答 6

27

间隔存储在有符号的 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 天,所以对于任何合理的事情来说都绰绰有余。

于 2012-09-28T04:25:03.720 回答
11

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

于 2012-09-28T04:14:39.770 回答
4

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

于 2012-09-28T04:14:29.957 回答
2

如果您需要的间隔大于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;
};
于 2021-05-01T22:34:00.617 回答
1

延迟参数被转换为有符号的 32 位整数。这有效地将延迟限制为 2147483647 毫秒,因为它在 IDL 中被指定为有符号整数。

它在文档中提到

于 2022-01-25T13:42:47.880 回答
1

最大值为2,147,483,647(2 31 -1)

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

setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y
于 2017-08-29T01:04:55.767 回答