最近项目有一个挑战答题的需求,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);
}
}