我在Firefox 15和Chrome 21上遇到以下代码问题:
setInterval(function () { console.log('test') }, 300000000000)
在两个浏览器上,该功能立即运行很快重复。当然,这是一个很大的数字(代表从现在开始大约10年),但我不认为它被视为微小或负数。我没有看到任何文档中允许的最大延迟。有没有人知道是否有标准最大值,或者这只是浏览器有趣吗?
答案 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