`

setInterval在任务队列排队情况测试

 
阅读更多
function formatDate(date){
	console.log(date.getFullYear()+"-"+(date.getMonth()+1)+date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds()+":"+date.getMilliseconds());
}

var timer ;
function test(){

		
	timer = setInterval(function(){
			console.log('interval');
	},8000);
	
	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();
	}
	
}

test();

 主逻辑test函数大概执行5×5=25秒,定时器setInterval大概8秒执行一次

那么在主逻辑运行的25秒内,此定时器大概被触发3(25/8=3)次

 

时刻8秒触发一次s1,

时刻18秒触发一次s2,

时刻24秒触发一次s3,

 

显然这些时刻,主逻辑test函数还在执行,那么猜想

A.定时器回调函数被放入到任务队列(消息队列)中去,等待主逻辑执行完毕后调用,

那么一旦执行任务队列的调用,将会有s1,s2,s3被相继取出,执行,输出3次interval,基本上可以理解为立刻输出3次interval,毕竟定时器回调函数太简单,基本不耗时

 

B.定时器智能化,在任务队列里面只保留一个回调任务,时刻8秒,s1放进去,然后时刻16秒,主逻辑还在执行,s1还在等待,那么s2被丢弃,同理,s3被丢弃(还有一种情况,是不是可以说s1丢弃,s2丢弃,s3保留呢?我不晓得

 

在chrome下执行,发现按照B猜想执行,只有一个定时器回调被保留

 

那么继续,假设我们把定时器间隔设定为9秒,那么在主逻辑执行到25秒时间内,有如下调用:

 

时刻9秒生成回调s1,

 

时刻18秒生成回调s2(丢弃),

 

时刻27秒生成回调s3

 

 

 

我们发现,大概在第25秒主逻辑执行完毕,从任务队列里面取出s1执行,然后在第27秒,生成s3放到任务队列,然后JS运行时取出执行,s3-s1之间间隔,大概27-25=2s,

那么明显,定时器不靠谱,不能保证每次执行会间隔起码9秒。。。

 

同时,试想,如果定时器回调逻辑太复杂,执行也要30秒,甚至更多,会发生什么?

 

 

 

分享到:
评论

相关推荐

    关于JS定时器(setTimeout setInterval)定时不准问题1

    setTimeout和setInterval的定时不准问题是由于JavaScript的单线程机制和浏览器的任务队列机制所致。通过动态计算时差的方法,可以减少setInterval的误差累计,但无法消除单个定时器执行延迟问题。

    JavaScript单线程和任务队列原理解析

    宏任务包括整体脚本、setTimeout、setInterval、I/O、UI渲染等,而微任务则包括Promise的then、process.nextTick(Node.js环境下)等。宏任务和微任务的执行顺序有一定的规则:每次执行栈清空后,会先执行当前宏任务...

    关于setInterval定时器的使用示例

    `setInterval`并不会精确地在指定的间隔时间执行,因为JavaScript是单线程的,如果当前执行栈中有其他任务,`setInterval`中的回调函数会被推迟执行。这意味着实际的执行间隔可能与预期不同,尤其是在处理耗时操作时...

    setInterval

    在JavaScript中,`setInterval`是一个非常重要的全局函数,它用于执行指定的函数或表达式,每隔一定的时间间隔。这个时间间隔通常以毫秒为单位。`setInterval`是JavaScript定时器API的一部分,用于实现定时任务,...

    setInterval 引起的性能问题

    在JavaScript编程中,`setInterval`是一个非常常用的函数,它用于定期执行某个任务。然而,如果不正确地使用,`setInterval`可能导致各种性能问题。这篇博客文章“setInterval引起的性能问题”探讨了这些问题以及...

    Javascript中, setTimeout() 和 setInterval() 的方法

    然而,需要注意的是,`setInterval()`在某些场景下可能导致意料之外的行为,因此在可能的情况下,使用`setTimeout()`配合递归调用来实现周期性任务可能更为可控。 例如,实现每2秒执行一次的循环,可以这样写: ```...

    12. code微任务和宏任务.zip

    宏任务是那些在主线程空闲时才会执行的任务,如setTimeout、setInterval、I/O操作、UI渲染等。而微任务则是在当前宏任务执行完毕后,但在下一次渲染之前立即执行的任务,比如Promise的then、catch、finally方法,...

    nanotask浏览器的Microtask队列调度程序

    6. **微任务与浏览器渲染**:由于微任务在宏任务执行后的第一时间执行,它们对于保持页面的实时响应性非常重要。比如,在用户交互后执行的异步操作,可以通过微任务来确保立即更新UI。 7. **CSS与JavaScript的交互*...

    浅谈javascript事件环微任务和宏任务队列原理

    在每个宏任务执行完毕后,且微任务队列清空后,会从宏任务队列中取出下一个任务进行执行。 来看一个经典的例子,涉及到`MutationObserver`、点击事件和`setTimeout`: ```javascript // ... // 添加点击事件监听 ...

    setInterval阻塞解决方案完整代码

    前端开发中,我们会会经常使用定时器setinterval setTimeout等,但当我们离开页面时,定时器会被阻塞,导致我们再回到页面的时候定时任务会混乱运行,为些我的解决方案写了个简单demo,希望对你有所帮助

    Javascript定时器(二)——setTimeout与setInterval

    在实际开发中,`setTimeout`常用于实现动画效果或延迟操作,而`setInterval`则适合用于周期性的任务,如轮询服务器数据。但需要注意的是,为了提高用户体验和性能,应当尽量避免过于频繁地使用定时器,特别是在移动...

    window.clearInterval与window.setInterval的用法.

    - 在多浏览器兼容性方面,虽然`setInterval`和`clearInterval`在现代浏览器中普遍可用,但在一些较老版本的浏览器中可能表现不一致。 综上所述,`window.setInterval`和`window.clearInterval`是JavaScript中非常...

    动态时钟,利用setInterval

    在JavaScript(JS)中,`setInterval`是一个非常重要的函数,尤其对于初学者而言,它提供了在指定间隔重复执行某段代码的能力。这个功能在创建动态时钟、定时任务、实时更新显示等场景中十分常见。现在我们来深入...

    setInterval使用 每隔一定时间执行操作

    在JavaScript中,`setInterval` 是一个非常重要的定时器函数,它允许我们在指定的时间间隔后重复执行某段代码。这个函数对于创建动态效果、轮询数据或者实现定时任务等场景非常有用。本篇文章将深入探讨`setInterval...

    利用Jquery队列实现根据输入数量显示的动画

    在JQuery中,所有的动画方法如.show()、.hide()、.fadeIn()、.fadeOut()以及许多自定义动画方法都可以被添加到队列中进行排队执行。本文介绍的利用JQuery队列实现根据输入数量显示的动画,是通过以下几个关键知识点...

    EventLoop.pptx

    宏任务包括`setTimeout`、`setInterval`、I/O操作等,它们会在当前宏任务执行完毕后,下一次宏任务之前执行。微任务通常涉及Promise的`then`回调、`process.nextTick`(在Node.js中)等,它们在当前宏任务的末尾,但...

    setTimeout和setInterval的区别

    因此,在处理耗时任务时,通常建议使用`setTimeout`来替代`setInterval`,并在回调函数中再次调用自身来实现周期性执行,以避免这种情况。 总之,理解`setTimeout`和`setInterval`的区别以及它们在实际开发中的应用...

    超级简单利用setInterval设置定时自动跳转的例子

    在实际应用中,为了提供更好的用户体验和避免异常情况,我们可能还需要加入一些额外的处理,比如在用户交互时清除定时器,或者在跳转前给出提示。以下是一个完整的示例,包含这些额外的考虑: ```javascript ...

    meteor-queue:Meteor.js的工作队列

    流星队列由Mongo和setInterval支持的Meteor.js作业队列特征按设置...允许有限的GUI操作(更改/删除/现在运行排队的任务,更改,停止setInterval任务)安装meteor add artwells:queue 添加到server.js或公共文件中: if

Global site tag (gtag.js) - Google Analytics