setInterval延时为Infinity

现象 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 返回的也是 Infinity。Infinity > 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; } }

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):