setTimeout定时器启动时刻测试

function formatDate(date){
	date = date || new Date();
	console.log(date.getFullYear()+"-"+(date.getMonth()+1)+date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds()+":"+date.getMilliseconds());
}

var timer ;
function test(){
		
	timer = setTimeout(function(){
			formatDate();
			console.log('timeout');
	},10000);
	
	var startDate = new Date();
	var now = new Date();
	
	for(var i =0; i<5; i++){
		formatDate(startDate);
		// 5 second
		while(new Date () - startDate < 5*1000){
			
		}

		startDate = new Date();
	}
	
	formatDate();
	console.log('test finished');
}

test();

猜想:

A.定时器timeout启动时刻为JS运行时执行到setTimeout时开始,

B.定时器timeout在JS运行时执行完主逻辑后开始计时

针对如上测试用例,我们发现主逻辑大概执行5×5=25秒,定时器设定为10秒后执行,

如果猜想A成立,那么主逻辑执行完毕以后,基本上立刻执行定时器逻辑,无需等待

如果猜想B成立,那么主逻辑执行完25秒后,再过10秒执行定时器逻辑

在chrome下测试,发现A逻辑成立

如果将定时器时间间隔设置为30秒,那么主逻辑执行完毕以后,大概过5秒,执行定时器逻辑,进一步验证A猜想成立

在整个过程中,其实不难发现,setTimeout能够保证回调逻辑在timeout设置时间后执行,与setInterval相比,起码保证了最小时间间隔

猜你喜欢

转载自luqingxuan.iteye.com/blog/2324140
今日推荐