美文网首页Web前端之路
setInterval延时为Infinity

setInterval延时为Infinity

作者: oNexiaoyao | 来源:发表于2020-09-03 10:05 被阅读0次
  • 现象

    windows 和 linux 系统网页挂载svg文件,出现cpu占比逐步增加的情况,时间过长后会发现页面浏览操作变得卡顿,鼠标事件响应变得很慢。最后可能导致系统崩溃。

  • 原因

    因为代码是由外包人员编写,因此找错的过程变得比较复杂,最终定位到以下的代码:

    const timeLine = sureMinTime();
    timeLine > 0 && setInterval(() => {
        lineChartT();
    }, timeLine * 1000);
    
    function sureMinTime() {
        let node = document.rootElement || document.getElementsByTagName("svg")[0];
        let nodeAction = node.querySelectorAll("g[TypeName = 'chartT']");
        let arr = [];
        nodeAction.forEach(e => {
            //...
            arr.push(((end - start) / Math.max(...arrMiddle)).toFixed(3) - 0);
        })
        return Math.min(...arr) || 0;
    }
    

    问题出在 return Math.min(...arr) || 0; 这句代码上。当arr的数组长度为0时,Math.min(...[]) 返回的结果是 Infinity。而 Infinity || 0 返回的也是 InfinityInfinity > 0返回 true, 且 Infinity * 1000依旧是Infinity(正无穷大)

    setTimeout/setInterval delay数值过大问题,如果 delay 是 Infinity 值,非数字(NaN)值或负值,则将超时设置为零,因此导致上面的定时器无延迟立即执行(这个是问题的根本原因)。

  • 修改

    function sureMinTime() {
        let node = document.rootElement || document.getElementsByTagName("svg")[0];
        let nodeAction = node.querySelectorAll("g[TypeName = 'chartT']");
        let arr = [];
        nodeAction.forEach(e => {
            //...
            arr.push(((end - start) / Math.max(...arrMiddle)).toFixed(3) - 0);
        })
        if (arr.length && Math.min(...arr) > 0) {
            return Math.min(...arr) || 0; 
        } else {
            return 0;
        }
    }
    

相关文章

  • setInterval延时为Infinity

    现象windows 和 linux 系统网页挂载svg文件,出现cpu占比逐步增加的情况,时间过长后会发现页面浏览...

  • js中setInterval与setTimeout用法

    js中setInterval与setTimeout用法 JS里设定延时: 使用SetInterval和设定延时函数...

  • setTimeout()和setInterval() 何时被调用

    定义 setTimeout()和setInterval()经常被用来处理延时和定时任务。setTimeout() ...

  • setTimeout()和函数节流

    setTimeout()方法 setInterval是设置间隔器;setTimeout是设置延时器。 window...

  • 定时器 延时器

    setInterval() 定时器 重复指定,默认情况下不会终止 setTimeout() 延时器 只会...

  • setTimeout用法

    JS定时延时执行代码的功能就是定时器,主要是setTimeout()和setInterval(),它们都是wind...

  • 2018-01-18

    vue 中无法清除定时器(延时器) vue中 使用定时器 ,setInterval(). 正常使用, 但是当想...

  • 定时器的使用01

    关键词:定时器、清除定时器、Date对象、charAt() 定时器:间隔性(setInterval)、延时性(se...

  • js 定时器

    js 提供了一些原生方法来实现延时去执行某一段代码; 如: setTimemout, setInterval, s...

  • JS setTimeout 和setInterval 的区别

    ——循环延时调用的最佳实现 我在刚开始的时候如果需要重复循环很多次的调用时,会选用setInterval函数。因为...

网友评论

    本文标题:setInterval延时为Infinity

    本文链接:https://www.haomeiwen.com/subject/cidnsktx.html