3

月に 1 回 Java スクリプト スレッドを実行するユース ケースがあります。しかし、setinterval 関数に 3.5 週間の遅延を与えると、それは無視され、1 秒に 1 回スケジューリングが開始されます。バグですか?遅延を与えるための最大制限はありますか?

興味深いことに、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>
4

1 に答える 1

1
1000*60*60*24*7*3.5 = 0x7e2bce00

これは 0x80000000 に非常に近いですが、32 の符号付き算術演算がどこかに原因があるのではないかと思います。

setIntervalの仕様とタイムアウトを確認したところ、両方とも符号付き 32 ビットを意味する値setTimeoutとして定義されています。long負のタイムアウト値がどのように扱われるかは不明です。

WhatWG仕様から:

long setTimeout(関数ハンドラー、オプションの長いタイムアウト、任意の...引数);

WebIDL標準から:

long 型は、[-2147483648, 2147483647] の範囲の値を持つ符号付き整数型です。

あなたの問題を解決するために、私は2つの提案をすることができます:

動作するのでsetTimeout、それを使用して、処理関数の最後に再トリガーします

または、必要な期間の半分の代わりsetIntervalに、トグルを使用してコードを1回おきに実行します。

于 2013-06-21T10:31:51.683 に答える