关于js多次点击触发定时器越走越快的问题


最近项目有一个挑战答题的需求,10 道题目,每道题要在 45s 内完成,初次答题的时候没问题,每当我点下一题的时候,倒计时会越老越快,为了搞懂这个问题,专门记录总结下来。

setTimeout

定义
setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。

语法

setTimeout(code, millisec);

参数
code:必需。要调用的函数后要执行的 JavaScript 代码串。
millisec: 必需。在执行代码前需等待的毫秒数。

提示
setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。

setTimeout()的用法


 <!DOCTYPE html>
  <html lang="en">
      <head>
            <meta charset="utf-8">
            <script>
                   setTimeout("alert('hello')",2000);
            </script>
       </head>
     <body>
     </body>
 </html>

页面会在停留 2 秒之后弹出对话框,注意 setTimeout 不会自动重复执行!

当然,setTimeout 也可以执行 function,还可以不断重复执行!

clearTimeout()

要使用 clearTimeout(),需要我们设定 setTimeout()时, 给予这 setTimeout()一个名称, 这名称就是 timeoutID ,我们叫停时,就是用这 timeoutID 来叫停


   <!DOCTYPE html>
    <html lang="en">
        <head>
              <meta charset="utf-8">
              <script>
                    var timeId= setTimeout("alert('hello')",2000);
                    clearTimeout(timeId);
             </script>
       </head>
      <body>
      </body>
  </html>

setInterval

setInterval()方法可按照指定的周期来调用函数或者计算表达式(以毫秒为单位)

语法:

setInterval(函数表达式,毫秒数)

setInterval()会不停的调用函数,直到 clearInterval()被调用或者窗口被关闭,由 setInterval()返回的 ID 值可用作 clearInterval()方法的参数。

setInterval 的用法

每 60 秒执行 myFunction()一次

setInterval("myFunction()",60000);
funcition myFunction(){
alert(’myFunction());
}

clearInterval()

function helloFun() {
trace(“Hello!”);
}
var myInterval= setInterval(helloFun,2000;
clearInterval(myInterval);

回到正题,在来说一说遇到的问题,当定时器使用 setInterval()时,setInterva() 会执行多次 setTimeout() 只会执行一次,由于 setTimeout() 只会执行一次,所以不会出现越走越快的问题;那么这个问题就只讨论 setInterval() 的情况。

解决 setInterval()定时器越走越快的问题
      clear() {
      clearInterval(this.timer); //每次调用时先的定时器
      const TIME_COUNT = 60;
      if (!this.timer) {
        this.count = TIME_COUNT;
        this.timer = setInterval(() => {
          if (this.count > 0 && this.count <= TIME_COUNT) {
            //限制倒计时区间
            this.count--;
          } else {
            clearInterval(this.timer); //删除定时器
            this.timer = null;
          }
        }, 1000);
      }
    }

文章作者: BiLiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BiLiang !
评论
  目录