【问题标题】:Does setTimeout() reset itself?setTimeout() 会自行重置吗?
【发布时间】:2013-10-02 20:00:34
【问题描述】:

我有一系列中断进入处理程序,我不想在上次中断后 5 毫秒之前为它们服务,这表明中断已经结束。

我的想法是在每次输入处理程序时调用setTimeout(LookAtInterrupts, 5),但我在setTimeout() 文档中没有看到如果在执行发生之前调用它会取消挂起的预定调用。

事实上,它会做什么?我不想在每个处理程序中断后 5 毫秒被调用,只是最后一个。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    不,它不会 - 您可以根据需要设置任意多个未决超时。

    该函数返回一个键,您可以在以后使用它来取消超时:

    var key = setTimeout( ... );
    

    然后再取消:

    clearTimeout(key);
    

    使用已经过期的密钥调用clearTimeout() 不会出错,因此您不必担心同步问题。

    【讨论】:

      【解决方案2】:

      setTimeout 不会自行重置。

      您可以手动重置超时

      var timeout = setTimeout(...);
      clearTimeout(timeout);
      

      【讨论】:

        【解决方案3】:

        setTimeout() 不会隐式取消任何以前的超时。

        但是,您可以通过将标识符存储在变量中并每次清除它来实现。

        var timeoutId = null;
        var yourFn = function() { 
             clearTimeout(timeoutId);
             timeoutId = setTimeout(fn, 5);
        };
        

        【讨论】:

          【解决方案4】:

          您需要存储参考。 setTimeout 的结果可以在以后存储和清除。

          对于“可重置”setTimeout

          // first assign it
          var timeout = setTimeout(function(){
            foo();
          }, 50);
          
          // then look for an existing assignment before re-assinging
          if (timeout) clearTimeout(timeout);
          timeout = setTimeout(function(){
            bar();
          }, 50);
          

          参考资料:

          顺便说一句,be careful 在设置超时

          【讨论】:

            【解决方案5】:

            将对该 setTimeout 调用的引用存储在一个变量中,并在每次成功中断后,在创建超时之前,取消之前的超时,

            var tv = null;
            
            function interrupt(){
                if(tv !== null){
                    clearTimeout(tv);
                }
                tv = setTimeout(LookAtInterrupts,5)
            }
            
            function LookAtInterrupts(){
            
            }
            

            这样,您将保证只有最后一个中断会以 5ms 的间隔继续执行。我希望这很清楚。

            【讨论】:

              【解决方案6】:

              虽然您可以自己实现此功能,但更实用的解决方案是获取 underscore.js 并使用它的去抖动功能(请参阅http://underscorejs.org/#debounce)。

              那么你可以这样做:

              var lookAtInterrupts = _.debounce(handleInterrupt, 5);
              

              生成的函数最多每 5 毫秒运行一次。

              【讨论】:

                【解决方案7】:

                setTimeout() 被执行时,它会安排一个调用你绑定的function()

                如果你想取消它,你必须得到setTimeout()返回的ID并清除为:

                var timeOutID = setTimeout( LookAtInterrupts, 5 );
                (...)
                clearTimeOut( timeOutID );
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-02-27
                  • 1970-01-01
                  • 2014-01-10
                  • 2015-04-29
                  • 1970-01-01
                  • 2021-11-05
                  • 1970-01-01
                  • 2012-05-30
                  相关资源
                  最近更新 更多