当前位置: 首页 > 后端技术 > Node.js

面试热点:浏览器和Node的宏任务和微任务

时间:2023-04-03 18:31:24 Node.js

前言极度投入,深度沉浸,边界清晰。前端是一小块鸡。分享的文章纯属个人观点。如果说的不对或者可以讨论,欢迎随时评论,和同学们一起学习~欢迎关注“前端进阶圈”公众号,我们一起探索和学习前端技术..公众号回复加群或扫码,即可加入前端交流学习群,长期交流学习……公众号回复加好友可以加为好友面试热点:浏览器中的宏任务和微任务以及Node浏览器中的宏任务和微任务?宏任务:脚本中的代码,setTimeout,setInterval,I/O,UI渲染宏任务:setTimeout、setInterval、setImmediate、script整体代码、I/O操作微任务:process.nextTick、newPromise().then()浏览器和Node宏任务和微任务有什么区别?node环境下的setTimeout会顺序执行,而浏览器是独立的浏览器端:在每一个宏任务执行前,会清空所有微任务队列Case//eg1:console.log(1);setTimeout(()=>console.log(2));Promise.resolve().then(()=>console.log(3));Promise.resolve().then(()=>setTimeout(()=>console.log(4)));Promise.resolve().then(()=>console.log(5));setTimeout(()=>console.log(6));console.log(7);//同步任务://console.log(1);//控制台日志(7);//宏任务://setTimeout(()=>console.log(2));//setTimeout(()=>console.log(6));//setTimeout(()=>console.log(4)))//微任务://Promise.resolve().then(()=>console.log(3));//承诺。解决()。然后(()=>设置超时(()=>控制台。日志(4)));//Promise.resolve().then(()=>console.log(5));/***结果:1735264*解析:*第一轮开始:*1.同步任务控制台日志(1);=>1*2.遇到宏任务,加入宏任务队列*3.遇到微任务,加入微任务队列*4.遇到微任务,加入微任务任务队列*5.遇到微任务,加入微任务队列*6.遇到宏任务,加入宏任务队列*7.同步任务console.log(7);=>7个宏任务:setTimeout(()=>console.log(2));setTimeout(()=>console.log(6));微任务:Promise.resolve().then(()=>console.log(3));Promise.resolve().then(()=>setTimeout(()=>console.log(4)));Promise.resolve().then(()=>console.log(5));*第一轮结果:17*第二轮开始:*1.执行microtask,取出队列第一项:console.log(3));=>3*2.执行微任务,取出队列中的第二项。将宏任务setTimeout(()=>console.log(4))添加到宏任务队列*3.执行微任务,取出队列中的第三项:console.log(5));=>5*4,此时microtask队列为空,执行macrotask队列的第一项:setTimeout(()=>console.log(2));=>2*5,此时microtask队列为空,执行macrotask队列中的第二项Item:setTimeout(()=>console.log(6));=>6*6,此时microtask队列为空,执行macrotask队列中的第三项:setTimeout(()=>console.log(4));=>4*7,此时所有任务执行完毕,返回结果宏任务:setTimeout(()=>console.log(2));setTimeout(()=>console.log(6));setTimeout(()=>console.log(4));Microtask:empty*第二轮结果:1735264最终结果:1735264*///eg2:setImmediate(functionA(){console.log(10);setImmediate(functionB(){console.log(11);});});console.log(1);setTimeout(()=>console.log(2));Promise.resolve().then(()=>console.日志(3));Promise.resolve().then(()=>setTimeout(()=>console.log(4)));Promise。resolve().then(()=>console.log(5));setTimeout(()=>console.log(6));process.nextTick(functionA(){console.log(8);过程。nextTick(functionB(){console.log(9);});});console.log(7);/***过程省略.....*///1789352641011文章特殊字符描述:问号Q:(问题)答案标记R:(结果)备注标准:A:(注意事项)详细描述标记:D:(详细信息)摘要标记:S:(摘要)分析annotation:Ana:(analysis)Tipannotation:T:(tips)往期回顾:热门面试题:VirtualDOM相关问题?热门面试题:什么是粘包/半包问题,如何解决?面试热点:console.log()是异步的?热门面试题:过程系列题?热门面试题:Node.js中的垃圾回收?面试热点问题:http3.0~http1.0有哪些改进?JavaScript中的AMD和CMD规范Vue数据监控Object.definedProperty()方法的实现最后:欢迎来到“前端进阶圈”探索和学习前端技术...公众号回复加群或扫码,可以加入前端交流学习群,长期交流学习...公众号回复加好友,可以加为好友