-3

最大値より大きい値を持つJavaスクリプトでsetTimeout()関数を処理する方法。

    <html>
    <body>
    <button onclick="funCall()">Try it</button>

    <script>
    function funCall()
    {
        setTimeout(function(){alert("Hello")},3147483647);
    }
   </script>
    </body>
    </html>
4

2 に答える 2

2

これは機能しているようです。

(function () {

    var timers = {};
    var id = 0;
    var maxT = 1000;  // can go up to (1 << 30)

    window.setLongTimeout = function (f, t) {
        var args = [].slice.call(arguments, 2);
        var now = (Date.now && Date.now()) || +(new Date);
        var end = now + t;
        var myid = ++id;

        (function loop() {
            var now = (Date.now && Date.now()) || +(new Date);
            var delta = end - now;
            if (delta <= 0) {
                delete timers[myid];
                f.apply(null, args);
            } else {
                timers[myid] = window.setTimeout(loop, Math.min(maxT, delta));
            }
        })();

        return id;
    };

    window.clearLongTimeout = function (myid) {
        window.clearTimeout(timers[myid]);
        delete timers[myid];
    };

})();

最初に指定された時間(32ビットに制限されていない)が経過するまで、定期的にタイムアウトを発生させます。

ミリ秒を超えて使用しようとすると、精度エラーが発生することが予想され2 ^ 52ます;-)

http://jsfiddle.net/alnitak/zGdn5/を参照してください

于 2013-02-13T17:40:16.380 に答える
1

setTimeoutは32ビットのsignedintを使用して遅延を格納するため、これを超える数値はすべて機能せず、コードはすぐに実行されます。

最大値を使用してsetTimeoutを作成し、関数内で最大値を使用して別のsetTimeoutを呼び出すことができます。

于 2013-02-13T17:12:05.420 に答える