如何显示由 setTimeout/setInterval 生成的每个正在运行的线程的列表

2024-04-27

我想通过纯 javascript 或浏览器中的任何类型的控制台或其他方式来完成此操作。

是否可以?

Thanks

进一步说明: 我想调试一个执行动画的库。我想知道如果有多个对象被动画化,是否会创建多个计时器。


注意setTimeout()不会产生新线程。浏览器端脚本不仅是单线程的,而且 JavaScript 评估与页面渲染共享相同的单线程(网络工作者 http://www.whatwg.org/specs/web-workers/current-work/ apart).

进一步阅读:

  • JavaScript 定时器如何工作 http://ejohn.org/blog/how-javascript-timers-work/作者:约翰·雷西格

您可能想自己构建一个计时器管理器:

var timerManager = (function () {
   var timers = [];
   return {
      addTimer: function (callback, timeout) {
         var timer, that = this;
         timer = setTimeout(function () {
            that.removeTimer(timer);
            callback();
         }, timeout);
         timers.push(timer);
         return timer;
      },
      removeTimer: function (timer) {
         clearTimeout(timer);
         timers.splice(timers.indexOf(timer), 1);
      },
      getTimers: function () {
         return timers;
      }
   };
})();

然后按如下方式使用它:

var t1 = timerManager.addTimer(function () {
   console.log('Timer t1 triggered after 1 second');
}, 1000);

var t2 = timerManager.addTimer(function () {
   console.log('Timer t2 triggered after 5 second');
   console.log('Number of Timers at End: ' + timerManager.getTimers().length);
}, 5000);

console.log('Number of Timers at Start: ' + timerManager.getTimers().length);

以上将在控制台中显示以下结果:

// Number of Timers at Start: 2
// Timer t1 triggered after 1 second
// Timer t2 triggered after 5 second
// Number of Timers at End: 0

请注意,timerManager上面的实现使用了Array.indexOf()方法。这是在 JavaScript 1.6 中添加的,因此并非所有浏览器都实现了。但是,您可以通过添加实现来轻松地自己添加该方法这篇 Mozilla 开发中心文章 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何显示由 setTimeout/setInterval 生成的每个正在运行的线程的列表 的相关文章