setTimeout时间值大于最大值

时间:2013-02-13 17:07:36

标签: javascript html

如何在javascript中处理值大于最大值的setTimeout()函数。

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

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

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

setTimeout使用32位signed int来存储延迟,因此每个数字都不起作用,代码会立即执行。

您可以创建一个具有最大值的setTimeout,并使用最大值调用函数内的另一个setTimeout。