问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

EventLoop的小记--微任务是否造成页面阻塞

发布网友 发布时间:2024-09-17 05:03

我来回答

1个回答

热心网友 时间:2024-10-02 10:06

Why

Javascript是一门单线程语言,也就是同一时间只能执行一个任务。在浏览器环境中存在很多异步任务,比如Promise、事件回调、setTimeout等这些异步任务。这些任务执行时间是不定的,满足一定的条件后就会调用这些异步回调函数。所以就需要一套机制来管理这些异步任务,不至于页面的阻塞。也就是Eventloop机制

简介

其实eventloop就是一个不断循环的读取异步任务的机制,首先他有一套既定的规则:

首先检查同步任务有没有执行完(也就是调用栈是否为空)。

如果为空的话,就去检查microtask(微任务)队列是否有任务,如果有的话就一次性把microtask(微任务)执行完为止(包括microtask(微任务)执行过程中再次生成微任务),直到microtask(微任务)队列为空再去检查宏任务macrotask(宏任务)队列。每执行完一个macrotask(宏任务)还要去检查microtask(微任务)队列是否为空,不为空的话先去把microtask队列清空。如此反复。

任务

上面说了microtask与macrotask就是异步任务的分类。创建它们的API也是不一样的比如:

创建microtask(微任务)的有Promise、MutationObserver等

创建macrotask(宏任务)的有:setTimeout、setInterval、requestAnimationFrameMessageChannel还有一些IO事件等(这里rAF有争议,但它绝对不是微任务)

任务表现差异

任务都是在调用栈中执行的,不断什么任务,单个任务是不能被中断的。

关于microtask(微任务)与macrotask(宏任务)上面说了它们的执行顺序不一样,也就是微任务的优先级高。但是还有一个最重要的不同任务表现区别,也就是这篇文章最想要记录的—微任务会阻塞页面的渲染,给用户造成卡顿的感觉。EventLoop类似的规则如下:

可以看出直到把microtask(微任务)队列情况才去执行渲染,有关视频可以去事件循环的进一步探索-ErinZimmer-JSConfEU2018看

我也做了一个demo验证上面的规则,确实如此:Demo跳转,这个demo其实就是在15秒之内一直执行、创建微任务or宏任务。在这期间去点击页面交互、看页面是否及时渲染。结果发现只有promise才会造成页面的卡顿,其他都不会(基于这个原因我更倾向把rAF规律为宏任务)。此外setTimeout还有最小4ms的限制(第一次执行除外)。也就容易理解React调度器scheduler为什么用MessageChanel来实现还有Vue的nextTick因此MessageChannel是一对一通信,没有像setTimeout受到4ms限制,还有rAF受到浏览器渲染频率限制(16.6ms)。

部分代码如下

constbutton2=document.querySelector('.btn2');button2.addEventListener('click',()=>{//可以交互,不会造成页面卡顿letpre=performance.now();letcount=0;constfn=()=>{count++;if(count%250===0){console.log('count',count);}if(performance.now()-pre<1000*15){setTimeout(()=>{fn();},0);}};fn();});不同宿主环境

JavaScript有不同的运行时环境,比如浏览器、Node、WebWorker等各种环境也为JS提供创建异步任务的API。上面说的是浏览器环境,比如Node环境还有setImmediateprocess.nextTick等,不同环境Eventloop也有差别。这里不做重点介绍。

Reference

规范文档

原文:https://juejin.cn/post/7098334897936269348
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ipad mini2怎么看小说 关于ipadmini的几点疑惑 苹果平板图书阅读软件推荐推荐一个苹果可以用的免费看小说app 风冷无霜为什么噪音大 华为matepad11多大尺寸的 applewatch可以发微信语音吗? 人类基因组组成 仅从染色体照片(黑白非显带的)能否区别X染色体和C组染色体? ...车子加速不上来是什么原因,节气门清洗过了也不行? 换了变数箱油洗了节气门 提速慢了 停下来起步根本没力气 什么是协程 沙糖桔吃多了对身体有什么影响? ...女生,她知道我喜欢她,可是空间里她经常不给我点赞,给别人点,啥意思... 美式风格的实木家具产品中,枫木和橡木哪种好?能不能具体说一下。_百度... 磷酸二铵施用 景色词语有哪些 形容风景词语有哪些 ...用洗洁精涂上衣服上再放洗衣机用洗好后就变黑色了怎办? 洗衣机洗完衣服后有黑的怎么回事? 默不作声的崩溃是成年人唯一的安慰剂吗? 成年人崩溃需要藏起来吗 村妇女主任述职述廉报告1000字 75乘9.9的简便方法 25x49 75x17的简便方法怎么做 75×75的简便运算怎么算 孩子转学怎么办理? 怎样才能转学籍啊? 什么是产品质量特性波动 ninjafrbsh 是什么意思 迪恩死了就醒了,从新过一天又死了,的那是哪一集第几季的 婴儿吃鸡什么位置的肉好 婴儿吃鸡肉哪个部位好 鸡睾丸怎样吃最补 银行承兑汇票拆分后如何入帐? 银行开的汇票是180万,可以拆分成10张18万的汇票嘛 HCG只要涨就是好的吗 hcg 早期48小时应该涨多少 山清水秀、身临其境、兴高采烈、依依不舍、兴高采烈组词 住房改门面房手续怎么办? 把住宅改成商铺,需要经过其他业主同意吗? 第六届地球小博士地理科技大赛高中组试题答案,还有论文,谢谢 崴了脚侧面肿了个大包怎么办 张艺兴个人资料(张艺兴个人简介) 张艺兴现在的经纪人是谁张艺兴个人资料介绍 张艺兴nobody什么梗 肝脏大小形态自然,外形规整,右肝脏内见斑点状致密影,边缘清晰。医院阅片... excel怎样整列取整数? ...只有附见:肝右叶见小斑片状致密影 和上次检查对比 右肺中叶感染灶部... excel如何统一取整数? ...致密,双乳皮肤良性钙化灶,BI–RADS:2,这样严重吗 B超提示: 肝脏实质回声增强致密欠均质( 脂肪沉积可能性大) 肝脏钙化灶...