实现相对准时的setTimeout

1 原生setTimeout实现

​
// 原生setTimeout执行
	let form ={}	
	function timer() { 
		var speed = 50, // 设定间隔 
		counter = 1,  // 计数 
		start = new Date().getTime(); 
		function instance() 
		{ 
			var ideal = (counter * speed), 
			real = (new Date().getTime() - start); 
			var diff = (real - ideal); 
			counter++; 

			form.ideal = ideal; // 记录理想值 
			form.real = real;   // 记录真实值 
			form.diff = diff;  // 差值 
			console.log(form)
			if(form.ideal < 2583){
				window.setTimeout(function() { instance(); }, speed); 
			}
		}; 
		window.setTimeout(function() { instance(); }, speed); 
	} 
	// 启动原生setTimeout测试
	timer();

​

结果:相差时间越来越长

2  requestAnimationFrame 方式实现,根据浏览器的刷新频率1s 60次

// requestAnimationFrame
	function animationFrame () { 
		let startTime = Date.now() 
		 
		var speed = 17 // 设定间隔 
		var counter = 0  // 计数 
		var start = new Date().getTime(); 
		function loop () { 
			const now = Date.now() 
			var ideal = (counter * speed)
			var real = (new Date().getTime() - start); 
			var diff = (real - ideal); 
			counter++

			form.ideal = ideal; // 记录理想值 
			form.real = real;   // 记录真实值 
			form.diff = diff;  // 差值 
			
			console.log(form)
			if(now - startTime < 2000) {
				requestAnimationFrame(loop) 
			}
			
		} 
		loop()
	}
	animationFrame()

结果:时间比较准 但是不能调整 越16 17 ms执行一次

3 setTimeout 通过系统时间补偿实现

// 系统时间补偿
	function timercom() { 
	    var speed = 50, 
	    counter = 1,  
	    start = new Date().getTime(); 
		
	    function instance() { 
			var real = (counter * speed), 
			ideal = (new Date().getTime() - start); 
			var diff = (ideal - real); 
			counter++; 
			form.ideal = ideal; // 记录理想值 
			form.real = real;   // 记录真实值 
			form.diff = diff; // 差值
			console.log(form)
			
			if(form.ideal < 3500){
				window.setTimeout(function() { instance(); }, (speed - diff)); // 通过系统时间进行修复 
			
			}
	    }; 
		
	   	window.setTimeout(function() { instance(); }, speed); 
	} 
	// 启动系统时间补偿测试
	timercom()

结果:时间可以设定 相差结果很小

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值