我在使用以下代码的 Firefox 15 和 Chrome 21 上遇到问题:
setInterval(function () { console.log('test') }, 300000000000)
在这两种浏览器上,该功能立即运行重复非常快。当然,这是一个很大的数字(代表大约 10 年后),但我不希望它被视为一个很小的数字或负数。我没有在任何文档中看到最大允许延迟。有谁知道是否有标准最大值,或者这只是浏览器很有趣?
我在使用以下代码的 Firefox 15 和 Chrome 21 上遇到问题:
setInterval(function () { console.log('test') }, 300000000000)
在这两种浏览器上,该功能立即运行重复非常快。当然,这是一个很大的数字(代表大约 10 年后),但我不希望它被视为一个很小的数字或负数。我没有在任何文档中看到最大允许延迟。有谁知道是否有标准最大值,或者这只是浏览器很有趣?
间隔存储在有符号的 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 天,所以对于任何合理的事情来说都绰绰有余。
目前我找不到任何文档,但如果计时器值必须适合 32 位有符号整数,我不会感到惊讶。
我认为最大延迟是 2 31 -1,即 2,147,483,647 毫秒。有符号 32 位整数的最大值,以 ms 为单位。如果它是无符号的,它将是 2 32 -1 = 4,294,967,295。
如果您需要的间隔大于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;
};
延迟参数被转换为有符号的 32 位整数。这有效地将延迟限制为 2147483647 毫秒,因为它在 IDL 中被指定为有符号整数。
它在文档中提到
最大值为2,147,483,647
(2 31 -1)
请注意,如果您使数字大于该数字,它将立即运行(想象您输入负值,因此浏览器将无限循环运行)
setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y