-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 位有符号整数来存储延迟,因此高于此的每个数字都不起作用,代码会立即执行。

您可以创建一个具有最大值的 setTimeout,然后他们在您的函数中调用另一个具有最大值的 setTimeout。

于 2013-02-13T17:12:05.420 回答