【问题标题】:Finding Leftover setTimeouts and setIntervals查找剩余的 setTimeout 和 setInterval
【发布时间】:2013-02-04 18:54:39
【问题描述】:

有没有办法查看当前运行的超时和/或使用 setTimeout 或 setInterval 创建的间隔?

由于每个都返回一个 ID,有没有办法在开发者控制台中查看当前的 ID?这将帮助我找到我的应用程序中的“漏洞”。

我现在能想到的唯一方法是为我的 setInterval/setTimeout 调用创建一个包装器。或者覆盖窗口中的内置对象(即window.setTimeout=function()),然后让对象映射保持跟踪。

【问题讨论】:

  • 我认为找到由 setTimeout/Interval 引起的“泄漏”的更好方法是在 JS 堆快照的单独部分中显示它们,而不是在开发者控制台中提供它们的列表。

标签: javascript google-chrome firebug google-chrome-devtools


【解决方案1】:

基于this answer

for (var i = 1; i < 99999; i++){
   window.clearInterval(i);
   window.clearTimeout(i);
}

希望这会有所帮助!

【讨论】:

  • @K2xL: 是的,根据此处给出的链接,您可能会尝试覆盖 setTimeout/setInterval,然后如果运行时间过长,则使用 #(new Error).lineNumber 行触发错误
【解决方案2】:

我刚刚为您编写的这段代码(有趣的练习)覆盖了setTimeoutclearTimeout 函数,并创建了跟踪在名为timeouts 的全局变量中可用的超时的函数。在 jsfiddle 上试试:http://jsfiddle.net/KqZmb/

(function() {
  window.timeouts = [];
  var _setTimeout = window.setTimeout;
  window.setTimeout = function() { 
    var id = _setTimeout.apply( this, arguments );
    timeouts.push( id );
    _setTimeout( function() {
        timeouts.splice( timeouts.indexOf( id ), 1);
      }, arguments[1] );
     return id;
  };
  var _clearTimeout = window.clearTimeout;
  window.clearTimeout = function( id ) { 
    _clearTimeout( id );
    timeouts.splice( timeouts.indexOf( id ), 1);
  };
})();

您可以轻松适应 setIntervalclearInterval

不过我想说的是,您可能需要跟踪超时,以避免应用程序中出现奇怪的行为...

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2018-02-03
    • 2011-04-11
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多