我们有一个每月运行一次java脚本线程的用例。但我们观察到的是,如果我们为setinterval函数提供3.5周的延迟,它就不会尊重它并开始每秒调度一次。这是一个错误吗?它是否有延迟的最大限制?
有趣的是,同样适用于setTimeOut。 -
<!DOCTYPE html>
<html>
<body>
<input type="text" id="clock" />
<script>
var int=setInterval(function(){clock()},1000*60*60*24*7*3.5);
function clock()
{
var d=new Date();
var t=d.toLocaleTimeString();
document.getElementById("clock").value=t;
}
</script>
<button onclick="int=window.clearInterval(int)">Stop</button>
</body>
</html>
答案 0 :(得分:1)
1000*60*60*24*7*3.5 = 0x7e2bce00
这非常接近0x80000000,我想知道32或者某个地方的签名算术是否有责任。
我刚检查了规范,setInterval
和setTimeout
的超时都被定义为long
值,这意味着签名为32位。目前尚不清楚如何处理负超时值。
来自WhatWG规范:
long setTimeout(函数处理程序,可选的长超时,任何... 参数);
来自WebIDL标准:
long类型是有符号整数类型,其值在该范围内 [-2147483648,2147483647]。
要解决您的问题,我可以提出两点建议:
由于setTimeout
有效,请在处理函数结束时使用它并重新触发
或者setInterval
,只需要一半的时间,并使用切换来每隔一段时间执行一次代码。