计时器和延时器的应用

延时器
延时器:延迟固定的时间执行特定的操作 => 默认只执行一次(每次执行完默认会被清除,可以理解为是一个特殊的计时器)
设置延时器:setTimeout(callback,interval,arg1,arg2,...argN);
callback 延迟固定的时间,执行特定的操作(回调函数)
interval 延迟时间(单位:ms)
arg1,arg2,...argN 如果回调函数需要接收参数,从第三参数开始依次向后传
返回值:延时器的编号(number)
清除延时器:clearTimeout(延时器编号)
作用:
1.清除正在执行的延迟操作(这时回调函数还没有调用)
2.延时器改计时器(利用递归)

计时器
=> 每隔固定的时间,执行特定的操作(回调函数 => 提前决定好要执行的内容,每隔指定时间执行)
setInterval(callback,interval,arg1,arg2,...argN);
参数:
callback 每隔固定的时间执行特定的操作(回调函数)
interval 间隔时间(ms)
arg1,arg2,...argN 如果回调函数需要接收参数,从第三参数开始依次向后传
返回值:计时器的编号(number)
清除计时器:clearInterval(生成计时器时对应的编号)(清除后的计时器无法再次启动,只能重新创建一个新的)

//HTML代码
<body>
		<button class="btn">按钮</button>
</body>
//JS代码
// 计时器 嵌套 计时器 
// 问题:如果外层间隔时间小于内层,则外层不会等待内层停止会直接开启下一层
// 期望: 外层计时器等待内层执行完毕在开启下一次  (延时器改计时器 => 递归调用自身)
var button = document.getElementsByClassName("btn")[0];//绑定按钮
var timer1 = null;//定义整个倒计时过程的延迟变量
var timer2 = null;//定义间隔时间
// debugger;
function timeDown(){
	clearTimeout(timer1);//在每一次开始前清除之前延时器的可能影响
	//延时器,用于等待一轮计时完成到下一轮,每次一轮计时都会延迟5秒
	timer1 = setTimeout(function(){
		console.log("倒计时开始:");
		var count = 5;//计数号
		console.log("倒计时5s:",count);
		//计时器,间隔一秒计数一次
		timer2  = setInterval(function(){
			count--;
			console.log("倒计时5s:",count);
			if(count == 1){
				clearInterval(timer2);
				console.log("倒计时结束");
				timeDown();
			//等count减到1时继续递归执行整个流程
			}
		},1000);
	},5000);
}
timeDown();
//定义按钮点击事件,点击按钮后结束计时
button.onclick = function(){
	clearTimeout(timer1);
	clearInterval(timer2);
}

实现结果:
image
上一次的计时结束到下一轮的计时开始之间都会等待五秒钟,点击页面的按钮后会结束计时。

posted @ 2022-03-30 19:55  嘻嘻不是菜鸟了  阅读(419)  评论(0)    收藏  举报