范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

jsEventLoop事件循环

  来源:Loong Panda
  概念
  Event Loop即事件循环,是解决javaScript单线程运行阻塞的一种机制。 主要是为了协调单线程下,事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程的不阻塞。
  因为JavaScript 是单线程,也就是说, 所有任务需要排队,前一个任务结束,才会执行后一个任务。
  但是IO设备(输入、出设备)可能会因为网络等因数导致速度很慢(比如Ajax)继而CPU没有充分利用,所以设计者将IO设备的任务挂起,先执行后面的任务,等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。于是,就把所有任务分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。
  同步任务:
  只有前一个任务执行完毕,才能执行后一个任务;直接在主线程上排队执行且最先执行,形成一个执行栈
  异步任务:
  不进入主线程、而是进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 一、microtask(微任务) 1、Promise.then 2、MutationObserver(Mutation Observer API 用来监视 DOM 变动) 3、Object.observe()(已废弃) 4、nextTick(Node.js 环境)  二、macrotask(宏任务) 1、script(整体代码) 注: 这个很容易忽略掉,就是指script根环境,而且它永远是第一个执行的宏任务(包含了同步的任务). 2、setTimeout 3、setInterval 4、setImmediate 5、IO 6、UI rendering(DOM event)执行机制:
  (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
  (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
  (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",执行一个宏任务, 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中 宏任务执行完毕后,再依次执行执行当前微任务队列中的所有微任务,当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)
  (4)主线程不断重复上面的第三步。
  任务队列
  "任务队列"是一个先进先出的数据结构,也是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件。
  "任务队列"中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。
  所谓"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。
  例子1 案例来源:https://juejin.cn/post/6844903512845860872 setTimeout(function() {    console.log("setTimeout");  })  new Promise(function(resolve) {    console.log("promise");  }).then(function() {    console.log("then");  })  console.log("console");  1、整体代码script这段代码作为宏任务,进入主线程。 2、先遇到setTimeout,将分发到宏任务Event Queue。 3、接下来遇到了Promise,new Promise立即执行,then函数分发到微任务Event Queue。 4、遇到console.log(),立即执行。 5、整体代码script作为第一个宏任务执行结束,然后会看有哪些微任务?我们发现了then在微任务Event Queue里面,执行。 6、第一轮事件循环结束了,我们开始第二轮循环,当然要从宏任务Event Queue开始。我们发现了宏任务Event Queue中setTimeout对应的回调函数,立即执行。 7.结束。
  例子2: setTimeout(() => {     console.log(3)     new Promise((resolve, reject) => {         console.log(5)         resolve()     }).then(console.log(6)) }, 0)  setTimeout(() => {     console.log(4) }, 0)  new Promise((resolve, reject) => {     console.log(1)     resolve() }).then(console.log(2)) 输出是1 2 3 5 6 4 分析: 1、前面的两个setTimeout都是宏任务,所以现在宏任务队列有2个任务 2、Promise里面的代码是同步任务,所以现在会马上执行 输出1 3、Promise的then是微任务,所以现在微任务队列有1个任务 4、在执行完同步任务之后,开始执行微任务,也就是console.log(2), 输出2 5、在执行完微任务之后,会执行宏任务,第一个宏任务也就是第一个setTimeout 6、第一个setTimeout会先输出3,然后输出5,因为这两个都是同步任务,然后遇到then,加入微任务队列,宏任务执行完重新开始下一个循环。 7、因为没有同步代码,所以接着执行微任务,此时微任务队列有1个任务(第6步加入), 宏任务队列还有1个任务(第6步执行完了第一个宏任务) 8、执行微任务,输出6 9、再执行宏任务,输出4
  例子3://主线程直接执行 console.log("1"); //丢到宏事件队列中 setTimeout(function() {     console.log("2");     process.nextTick(function() {         console.log("3");     })     new Promise(function(resolve) {         console.log("4");         resolve();     }).then(function() {         console.log("5")     }) }) //微事件1 process.nextTick(function() {     console.log("6"); }) //主线程直接执行 new Promise(function(resolve) {     console.log("7");     resolve(); }).then(function() {     //微事件2     console.log("8") }) //丢到宏事件队列中 setTimeout(function() {     console.log("9");     process.nextTick(function() {         console.log("10");     })     new Promise(function(resolve) {         console.log("11");         resolve();     }).then(function() {         console.log("12")     }) })  结果:     输出为1,7,6,8,2,4,3,5,9,11,10,12。  分析:     首先浏览器执行js进入第一个宏任务进入主线程, 直接打印console.log("1")         • 遇到 setTimeout  分发到宏任务Event Queue中         • 遇到 process.nextTick 丢到微任务Event Queue中         • 遇到 Promise, new Promise 直接执行 输出 console.log("7");         • 执行then 被分发到微任务Event Queue中          •第一轮宏任务执行结束,开始执行微任务 打印 6,8         •第一轮微任务执行完毕,执行第二轮宏事件,执行setTimeout         •先执行主线程宏任务,在执行微任务,打印"2,4,3,5"         •在执行第二个setTimeout,同理打印 ‘9,11,10,12’         •整段代码,共进行了三次事件循环
  误区
  nodejs事件循环和浏览器的事件循环不一样的。  浏览器的Event loop是在HTML5中定义的规范,而node中则由libuv库实现

用什么卡流量多又实惠,腾讯大王,米粉还是其他的?我是大伽侃电商,现在市场电话卡太多,至于流量优惠与否还不好说,大多数人喜欢上网,流量就是根本,所以急需一张好的流量卡。移动电信阿里腾讯小米等,移动的网络比较稳定,但费用不便宜,小米中科院用58小时讲完的python!整整675集,拿走不谢兄弟,毫无套路!福利分享本套视频一共1200集,共分4季第一季Python基础第二季Python深入和扩展第三季网络编程多线程扩展库第四季算法Python源码函数式编程手工实现神经下一代Windows发布会于6月24日进行微软宣布,将于北京时间6月24日2300举行公布下一代Windows的线上活动。Windows桌面版的UI将全面革新。Windows的UI改造已经进行了一段时间了,代号为太阳谷(S李楠评华为发布鸿蒙OS2挽澜于极危的确佩服CNMO新闻作为原魅族科技高级副总裁,李楠在离开魅族后创立了怒喵科技,虽然跟手机行业关联度不大,但他经常会在微博上对手机圈的热点事件和产品发表评论。在6月2日晚,华为召开备受瞩目的鸿蒙来了,升级太热入口崩溃昨天晚上,我们中国自己的操作系统鸿蒙,来了!在直播里,我们系统的感受了鸿蒙系统所带给我们的万物互联的便捷和单纯手机操控体验的顺滑。发布会的结语,有一种悲壮却又豪气干天的英雄气概今天华为鸿蒙系统真来了,完整升级名单曝光,荣耀也能用大家好,欢迎来到黑马公社。就在昨晚,华为终于推出了鸿蒙系统和一些搭载了鸿蒙系统的设备。怎么说呢,整场发布会的风格黑马是越看越眼熟。其实像华为这种体量,真的没有必要在这些方面向友商学鸿蒙正式发布!打破美国20年系统垄断,还有啥理由不支持呢?文毛毛华为放大招了!正式发布HarmonyOS2,我们自己的操作系统,问世了!鸿蒙,本指盘古开天地前,天地不分,一片混沌,2019年5月,贸易摩擦正激烈,西方开始制裁华为,切断华为什么值得买618无线耳机篇文丨悠哉悠哉平泽唯bigfun社区大家好,我是爱音乐的平泽唯。在前几天分享过自己选无线耳机的一些方法和经验,但相信大家肯定喜欢看哪种直接给你选好的购买攻略。所以,今天它来了!在本篇鸿蒙系统,发布在众多的期待中,华为的鸿蒙发布了。6月2日晚8点,华为发布了新一代智能终端操作系统HarmonyOS2及多款搭载HarmonyOS2的新产品。同时,华为鸿蒙OS将正式开启规模化推送关于鸿蒙的六大疑问,搞清楚才算弄懂鸿蒙昨晚,属于中国人自己的手机操作系统,准确来讲是包括手机在内的智能终端操作系统正式到来鸿蒙系统HarmonyOS2发布,随即在全球受到广泛关注。鸿蒙系统的这次发布,意味着我们在5G万华为WATCH3Pro上手实测,到底值不值得买?以我现在在用的CT2的体验非常棒睡眠监测呼吸监测心率监测血氧监测心脏异常报警等功能,新品会增加心电图血压监测血糖控制引导等,佩戴华为手表等于是每天体检。随着老龄化的到来,增加血压功
OPPO时尚灵感家呼之欲出,快猜猜她是谁经历了多年发展,今天的OPPO已然成为人尽皆知的时尚手机精品,其打造的众多爆款也覆盖了各个价位,从入门级的A系列到旗舰级的FindX系列,无不融汇着OPPO对于手机科技的深刻理解。AWE2021上花样百出,海信撑起中国智造一片天一直以来,AWE大展都是家电领域的风向标,在展会上出现的各种新产品新技术新概念都堪称未来家电行业发展的潮流趋势,甚至能左右家电行业的走向。也正是在这样的世界性家电展会上,能够拿出更上海民办华二道歉,是家长玻璃心还是学校太过分?五月一日是国际劳动节,许多人报复性旅游已至各地都扎堆了。然而魔都这边,却让一家民办学校给占了C位,这学校就是嘉定区的华二超级中学,这学校虽然在郊区,但也是实打实的名校,小升初很多市环保人士马斯克一句话,矿老板当场去世币圈大新闻接连不断,但凡业内有什么风吹草动,挖矿玩家们的内心也必然是起起伏伏,特别是那些高价入手矿卡的人们真是生怕自己成了新鲜韭菜。刚刚特斯拉CEO马斯克突然宣布停止用比特币支付买知名私募老板被原配举报代孕生子,最爱的人往往伤的最深你是我最爱的人,却伤我最深。本以为这就歌词随便唱唱,青年男女无病呻吟用的,没想到到了商界尤其是知名企业家这里,分外受用。最狠的刀,往往来自枕边人,无他,太熟了,知道要害在哪里。去年蛋壳租客抄底蛋壳股票,维权群想变接盘群昨天,蛋壳的租客哭天抢地,因为蛋壳被传要破产,多地蛋壳公寓出现断网断电,甚至房东上门赶人。虽然这几天艳阳高照,但寒流很快来了,这是要在寒冷的街头,拖上大包小包的行李扮演卖火柴的小女蛋壳碎了,微众买单?这个冬天,所有涉足了长租公寓的人,都欠胡景晖一句谢谢提醒。2018年,官拜我爱我家副总裁的胡景晖说了一句长租公寓爆仓,一定比P2P暴雷更厉害。然后链家老板左晖一个电话就打到了我爱我碎成渣的蛋壳,有没有白衣骑士能救?今天蛋壳又上了热搜,因为两件事。一个弱不禁风的女孩子,在房东过来强行收房时,被逼无奈拿出了一个只能削水果的小刀,试图阻止想让她赶紧搬家滚蛋的壮汉。女孩目测1米5到1米6之间,体型廋因为住蛋壳,我活得像条狗最近一段时间,游琅都活得惶惶不可终日,不知道下班的时候,行李有没有被扔出来,也担心哪天住着住着,突然密码就不能用了,就进不去屋子了。然后自己要像流浪狗一样游荡在冬日的街头。上个月开生化危机4VR登陆Quest2相当出色的VR移植作品(映维网2021年10月21日)尽管会是新发行的作品,但即将登陆OculusQuest2的生化危机4VR无法掩盖其岁月的痕迹,毕竟这款开创性的恐怖求生游戏最初是于2005年通过Ga小派将在年度PimaxFrontier发布突破性的VR3。0虚拟现实技术声明新闻稿非映维官方稿,法律问题一律与映维无关加利福尼亚州旧金山2021年10月18日PimaxInnovation(小派),一家专注于高端虚拟现实(VR)硬件产品的技术型公司,今