代码之家  ›  专栏  ›  技术社区  ›  spice

设置和使用单个全局setTimeout?

  •  0
  • spice  · 技术社区  · 6 年前

    只是无意中发现了一条评论 this very old question 关于清除所有设置超时。

    这条评论引起了我的兴趣,因为它实际上并没有直接解决这个问题,而是为跟踪多个计时器的问题提供了一个非常有趣的替代解决方案,但遗憾的是,他没有提供如何实现这一点的示例:

    使用一个全局超时,所有其他函数都会从中获取时间 从。这将使一切运行更快,更易于管理, 虽然它会给你的代码增加一些抽象。。。

    ... 我的意思是,你有一个全局超时运行每一天 50ms。其他需要定时元件的功能 然后从全局超时中获取它。谷歌转投这家公司

    我假设在全局空间中设置一个命名计时器,然后在多个情况下在其他地方引用它,那么我们将如何着手呢?

    例如,如果我们在全局空间中有这样的东西:

    let myGlobalTimer = setTimeout(function(){ myFunc(); }, 50);
    

    myFunc 每50毫秒。

    我很确定你不能把动态函数名传给 setTimeout 那么如何才能做到这一点呢?

    1 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    可以通过数组或 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);

    当然,也可以使用数组,但是 秩序 收藏中的物品数量无关紧要。