偶然发现this very old question中有关清除所有setTimeouts的评论。
该评论引起了我的兴趣,因为它实际上并未直接解决该问题,但是为跟踪多个计时器的问题提供了一个非常有趣的替代解决方案,但可悲的是,他没有提供如何实现此示例的示例:< / p>
使用全局超时,您的所有其他函数都可以得出定时 从。这将使一切运行得更快,并且更易于管理, 尽管它将为您的代码添加一些抽象...
...我只是说您有一个全局超时,每次运行一次 50毫秒其他所有需要计时元素的功能都会 然后从全局超时中获取它。 Google切换为此 效率,尽管我找不到引用它的文章。
如何在全局空间中设置我假设是命名计时器,然后在多种情况下在其他地方引用它呢?
例如,如果我们在全局空间中有这样的东西:
let myGlobalTimer = setTimeout(function(){ myFunc(); }, 50);
那只会每50毫秒运行myFunc
。
我很确定您不能将动态函数名称传递到setTimeout
中,那么如何实现呢?
答案 0 :(得分:2)
每次触发超时时,都可以通过数组或函数Set
来运行超时。要添加每次迭代都运行的函数,请将其添加到Set
;中。要使其停止运行,请将其从Set
中删除。例如:
const fns = new Set();
function runAllTasks() {
for (const fn of fns) {
fn();
}
// Run every 500 ms:
setTimeout(runAllTasks, 500);
}
fns.add(() => console.log('fn one running'));
const fn2 = () => console.log('fn two running');
fns.add(fn2);
runAllTasks();
// example, remove fn2 from the Set after 1300ms:
setTimeout(() => {
fns.delete(fn2);
}, 1300);
当然,您也可以使用数组,但是当集合中项目的 order 无关紧要时,Set
更合适。