宏任务与微任务

微任务与宏任务定义
一、宏任务 
   《1》分类: setTimeout setInterval 
   《2》定义:宏任务所处的队列就是宏任务队列
   《3》第一个宏任务队列中只有一个任务:执行主线程的js代码
   《4》宏任务队列可以有多个
   《5》当宏任务队列中的任务全部执行完以后会查看是否有微任务队列,如果有就先执行微任务队列中的所有任务。如果没有就查看是否有宏任务队列。
 
二、微任务
   《1》分类:new Promise().then(回调)  node中的process.nextTick
   《2》定义:微任务所处的队列就是微任务队列
   《3》只有一个微任务队列
   《4》在上一个宏任务队列执行完毕后如果有微任务队列就会执行微任务队列中的所有任务
 

微任务与宏任务的区别

 

这个就像去银行办业务一样,先要取号进行排号。
一般上边都会印着类似:“您的号码为XX,前边还有XX人。”之类的字样。

 

因为柜员同时职能处理一个来办理业务的客户,这时每一个来办理业务的人就可以认为是银行柜员的一个宏任务来存在的,当柜员处理完当前客户的问题以后,选择接待下一位,广播报号,也就是下一个宏任务的开始。
所以多个宏任务合在一起就可以认为说有一个任务队列在这,里边是当前银行中所有排号的客户。
任务队列中的都是已经完成的异步操作,而不是说注册一个异步任务就会被放在这个任务队列中,就像在银行中排号,如果叫到你的时候你不在,那么你当前的号牌就作废了,柜员会选择直接跳过进行下一个客户的业务处理,等你回来以后还需要重新取号

 

而且一个宏任务在执行的过程中,是可以添加一些微任务的,就像在柜台办理业务,你前边的一位老大爷可能在存款,在存款这个业务办理完以后,柜员会问老大爷还有没有其他需要办理的业务,这时老大爷想了一下:“最近P2P爆雷有点儿多,是不是要选择稳一些的理财呢”,然后告诉柜员说,要办一些理财的业务,这时候柜员肯定不能告诉老大爷说:“您再上后边取个号去,重新排队”。
所以本来快轮到你来办理业务,会因为老大爷临时添加的“理财业务”而往后推。
也许老大爷在办完理财以后还想 再办一个信用卡?或者 再买点儿纪念币?
无论是什么需求,只要是柜员能够帮她办理的,都会在处理你的业务之前来做这些事情,这些都可以认为是微任务。

 

这就说明:你大爷永远是你大爷
在当前的微任务没有执行完成时,是不会执行下一个宏任务的。
 

Event Loop(事件循环)

事件循环,先执行宏任务,其中同步任务立即执行,异步任务,加载到对应的的Event Queue中(setTimeout等加入宏任务的Event Queue,Promise.then加入微任务的Event Queue),所有同步宏任务执行完毕后,如果发现微任务的Event Queue中有未执行的任务,会先执行其中的任务,这样算是完成了一次事件循环。接下来查看宏任务的Event Queue中是否有未执行的任务,有的话,就开始第二轮事件循环,依此类推。
举例
总结
 
  • javascript是一门单线程语言
  • Event Loop是javascript的执行机制
 
posted @ 2020-01-02 13:04  Godfi  阅读(283)  评论(0编辑  收藏  举报