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