轻识Logo
目录

    JS时间循环-宏任务与微任务

    1、关于JavaScript

    JavaScript是一门单线程语言,在最新的html5中提出了Web-Worker,但javascript是单线程这一核心仍未改变。所以一切javascript版的"多线程"都是用单线程模拟出来的,一切javascript多线程都是纸老虎!

    2、javascript事件循环

    既然js是单线程,那就像只有一个窗口的银行,客户需要排队一个一个办理业务,同理js任务也要一个一个顺序执行。如果一个任务耗时过长,那么后一个任务也必须等着。
    那么问题来了,假如我们想浏览新闻,但是新闻包含的超清图片加载很慢,难道我们的网页要一直卡着直到图片完全显示出来?因此聪明的程序员将任务分为两类:
    • 同步任务
    • 异步任务
    当我们打开网站时,网页的渲染过程就是一大堆同步任务,比如页面骨架和页面元素的渲染。而像加载图片音乐之类占用资源大耗时久的任务,就是异步任务。
    关于这部分有严格的文字定义,但本文的目的是用最小的学习成本彻底弄懂执行机制,所以我们用导图来说明:


    导图要表达的内容用文字来表述的话:

    • 同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。

    • 当指定的事情完成时,Event Table会将这个函数移入Event Queue。

    • 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。

    • 上述过程会不断重复,也就是常说的Event Loop(事件循环)。

    我们不禁要问了,那怎么知道主线程执行栈为空啊?js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。

    3、Promise与process.nextTick(callback)

    Promise的定义和功能本文不再赘述,不了解的读者可以学习一下阮一峰老师的Promise。而process.nextTick(callback)类似node.js版的"setTimeout",在事件循环的下一次循环中调用 callback 回调函数。

    我们进入正题,除了广义的同步任务和异步任务,我们对任务有更精细的定义:

    • macro-task(宏任务):包括整体代码script,setTimeout,setInterval

    • micro-task(微任务):Promise,process.nextTick

    不同类型的任务会进入对应的Event Queue,比如setTimeout和setInterval会进入相同的Event Queue。

    事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。



    事件循环的进程模型

    • 选择当前要执行的任务队列,选择任务队列中最先进入的任务,如果任务队列为空即null,则执行跳转到微任务(MicroTask)的执行步骤。

    • 将事件循环中的任务设置为已选择任务。

    • 执行任务。

    • 将事件循环中当前运行任务设置为null。

    • 将已经运行完成的任务从任务队列中删除。

    • microtasks步骤:进入microtask检查点。

    • 更新界面渲染。

    • 返回第一步。


    执行栈在执行完同步任务后,查看执行栈是否为空,如果执行栈为空,就会去检查微任务(microTask)队列是否为空,如果为空的话,就执行Task(宏任务),否则就一次性执行完所有微任务。

    每次单个宏任务执行完毕后,检查微任务(microTask)队列是否为空,如果不为空的话,会按照先入先出的规则全部执行完微任务(microTask)后,设置微任务(microTask)队列为null,然后再执行宏任务,如此循环。

    例子:


     输出结果:

    1 7 6 8 2 4 3 5 9 11 10 12

    4.process.nextTick和Promise都是Microtasks(微任务),为什么process.nextTick会先执行?


    rocess.nextTick 永远大于 promise.then,原因其实很简单。。。在Node中,_tickCallback在每一次执行完TaskQueue中的一个任务后被调用,而这个_tickCallback中实质上干了两件事:

    1、nextTickQueue中所有任务执行掉(长度最大1e4,Node版本v6.9.1)

    2、第一步执行完后执行_runMicrotasks函数,执行microtask(微任务)中的部分(promise.then注册的回调)

    所以很明显 process.nextTick > promise.then

    5、总结

    (1)js的异步

    我们从最开头就说javascript是一门单线程语言,不管是什么新框架新语法糖实现的所谓异步,其实都是用同步的方法去模拟的,牢牢把握住单线程这点非常重要。

    (2)事件循环Event Loop

    事件循环是js实现异步的一种方法,也是js的执行机制。

    (3)javascript的执行和运行

    执行和运行有很大的区别,javascript在不同的环境下,比如node,浏览器,Ringo等等,执行方式是不同的。而运行大多指javascript解析引擎,是统一的。

    (4)setImmediate

    微任务和宏任务还有很多种类,比如setImmediate等等,执行都是有共同点的,有兴趣的同学可以自行了解。

    (5)最后的最后

    • javascript是一门单线程语言

    • Event Loop是javascript的执行机制

    6、深入浅出分析process.nextTick() 

    process.nextTick() 是 Node 的一个定时器,让任务可以在指定的时间运行。其中 Node 一共提供了 4 个定时器,它们分别是 setTimeout()、setInterval()、setImmediate()、process.nextTick()。

    process.nextTick() 这个名字有点误导,它是在本轮循环执行的,而且是所有异步任务里面最快执行的。

    Node 执行完所有同步任务,接下来就会执行process.nextTick的任务队列。所以,下面这行代码是第二个输出结果。

    process.nextTick(() => console.log(3));

    基本上,如果你希望异步任务尽可能快地执行,那就使用 process.nextTick。

    根据语言规格,Promise 对象的回调函数,会进入异步任务里面的”微任务”(microtask)队列。
    微任务队列追加在 process.nextTick 队列的后面,也属于本轮循环。所以,下面的代码总是先输出 3,再输出 4。

    process.nextTick(() => console.log(3));Promise.resolve().then(() => console.log(4)); // 3 // 4

    注意,只有前一个队列全部清空以后,才会执行下一个队列。

    process.nextTick(() => console.log(1));Promise.resolve().then(() => console.log(2));process.nextTick(() => console.log(3));Promise.resolve().then(() => console.log(4)); // 1 // 3 // 2 // 4

    上面代码中,全部 process.nextTick 的回调函数,执行都会早于 Promise 的。


    本文完〜


    浏览 32
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报
    彻底了解js事件循环怎么处理宏任务、微任务
    入坑互联网
    0
    【JS】834- 图解 JavaScript 事件循环:微任务和宏任务
    前端自习课
    0
    一次搞懂- JS 事件循环之宏任务和微任务
    SegmentFault
    0
    JavaScript的执行机制(同步任务、异步任务、微任务、宏任务)
    前端历劫之路
    0
    字节面试官:requestAnimationFrame 是宏任务还是微任务?
    前端人
    0
    React 中 setState 是一个宏任务还是微任务?
    程序员成长指北
    0
    React 中 setState 是一个宏任务还是微任务?
    更了不起的前端
    0
    React 中 setState 是一个宏任务还是微任务?
    更了不起的前端
    0
    对微任务和宏任务的执行顺序的理解
    前端人
    0
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报

    天下网标王兰州网站seo优化工具韶关企业网站关键词优化工具宁海网站关键词优化方案随州网站优化效果图片网站优化方法私营医院网站优化服务商电商网站系统优化沈阳网站关键字优化网站优化今日价格SEO网站排名优化实战高级技法浙江省网站优化企业温州网站优化维护天门外包网站优化网站优化曝光尚词网绍兴seo优化网站费用网站排名优化追云速捷好网站排名优化选择金手指信誉广州正规网站优化定制网站制作优化24小时接单无锡网站优化平台武侯网站排名优化公司酒泉市网站seo优化排名百度快照是网站优化吗华容区网站关键词排名优化报价出名的餐饮行业网站优化欢迎咨询江山百度网站优化新网站如何写seo优化东台网站优化收费标准韶关建材网站seo优化凌源网站关键词优化系统香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

    天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化