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秒,甚至更多,会发生什么?
相关推荐
setTimeout和setInterval的定时不准问题是由于JavaScript的单线程机制和浏览器的任务队列机制所致。通过动态计算时差的方法,可以减少setInterval的误差累计,但无法消除单个定时器执行延迟问题。
宏任务包括整体脚本、setTimeout、setInterval、I/O、UI渲染等,而微任务则包括Promise的then、process.nextTick(Node.js环境下)等。宏任务和微任务的执行顺序有一定的规则:每次执行栈清空后,会先执行当前宏任务...
`setInterval`并不会精确地在指定的间隔时间执行,因为JavaScript是单线程的,如果当前执行栈中有其他任务,`setInterval`中的回调函数会被推迟执行。这意味着实际的执行间隔可能与预期不同,尤其是在处理耗时操作时...
在JavaScript中,`setInterval`是一个非常重要的全局函数,它用于执行指定的函数或表达式,每隔一定的时间间隔。这个时间间隔通常以毫秒为单位。`setInterval`是JavaScript定时器API的一部分,用于实现定时任务,...
在JavaScript编程中,`setInterval`是一个非常常用的函数,它用于定期执行某个任务。然而,如果不正确地使用,`setInterval`可能导致各种性能问题。这篇博客文章“setInterval引起的性能问题”探讨了这些问题以及...
然而,需要注意的是,`setInterval()`在某些场景下可能导致意料之外的行为,因此在可能的情况下,使用`setTimeout()`配合递归调用来实现周期性任务可能更为可控。 例如,实现每2秒执行一次的循环,可以这样写: ```...
宏任务是那些在主线程空闲时才会执行的任务,如setTimeout、setInterval、I/O操作、UI渲染等。而微任务则是在当前宏任务执行完毕后,但在下一次渲染之前立即执行的任务,比如Promise的then、catch、finally方法,...
6. **微任务与浏览器渲染**:由于微任务在宏任务执行后的第一时间执行,它们对于保持页面的实时响应性非常重要。比如,在用户交互后执行的异步操作,可以通过微任务来确保立即更新UI。 7. **CSS与JavaScript的交互*...
在每个宏任务执行完毕后,且微任务队列清空后,会从宏任务队列中取出下一个任务进行执行。 来看一个经典的例子,涉及到`MutationObserver`、点击事件和`setTimeout`: ```javascript // ... // 添加点击事件监听 ...
前端开发中,我们会会经常使用定时器setinterval setTimeout等,但当我们离开页面时,定时器会被阻塞,导致我们再回到页面的时候定时任务会混乱运行,为些我的解决方案写了个简单demo,希望对你有所帮助
在实际开发中,`setTimeout`常用于实现动画效果或延迟操作,而`setInterval`则适合用于周期性的任务,如轮询服务器数据。但需要注意的是,为了提高用户体验和性能,应当尽量避免过于频繁地使用定时器,特别是在移动...
- 在多浏览器兼容性方面,虽然`setInterval`和`clearInterval`在现代浏览器中普遍可用,但在一些较老版本的浏览器中可能表现不一致。 综上所述,`window.setInterval`和`window.clearInterval`是JavaScript中非常...
在JavaScript(JS)中,`setInterval`是一个非常重要的函数,尤其对于初学者而言,它提供了在指定间隔重复执行某段代码的能力。这个功能在创建动态时钟、定时任务、实时更新显示等场景中十分常见。现在我们来深入...
在JavaScript中,`setInterval` 是一个非常重要的定时器函数,它允许我们在指定的时间间隔后重复执行某段代码。这个函数对于创建动态效果、轮询数据或者实现定时任务等场景非常有用。本篇文章将深入探讨`setInterval...
在JQuery中,所有的动画方法如.show()、.hide()、.fadeIn()、.fadeOut()以及许多自定义动画方法都可以被添加到队列中进行排队执行。本文介绍的利用JQuery队列实现根据输入数量显示的动画,是通过以下几个关键知识点...
宏任务包括`setTimeout`、`setInterval`、I/O操作等,它们会在当前宏任务执行完毕后,下一次宏任务之前执行。微任务通常涉及Promise的`then`回调、`process.nextTick`(在Node.js中)等,它们在当前宏任务的末尾,但...
因此,在处理耗时任务时,通常建议使用`setTimeout`来替代`setInterval`,并在回调函数中再次调用自身来实现周期性执行,以避免这种情况。 总之,理解`setTimeout`和`setInterval`的区别以及它们在实际开发中的应用...
在实际应用中,为了提供更好的用户体验和避免异常情况,我们可能还需要加入一些额外的处理,比如在用户交互时清除定时器,或者在跳转前给出提示。以下是一个完整的示例,包含这些额外的考虑: ```javascript ...
流星队列由Mongo和setInterval支持的Meteor.js作业队列特征按设置...允许有限的GUI操作(更改/删除/现在运行排队的任务,更改,停止setInterval任务)安装meteor add artwells:queue 添加到server.js或公共文件中: if