浏览器事件环简单直接:当前栈执行完成(同步代码主线程上执行完成)->清空微任务->宏任务队列中的第一项推到栈中执行(若是有微任务,将微任务放入微任务队列)->清空微任务队列->宏任务第二项任务执行,依此循环,直到结束。node
微任务:Promise.then/mutationObesrve(process.nextTick是node才有的) 宏任务:setTimeout、setInterval、setTmmediate(只兼容ie)、messageChannel浏览器
event loop的事件处理机制的运做方式。异步
当Node.js启动时会初始化event loop, 每个event loop都会包含按以下顺序六个循环阶段,oop
每个阶段都对应一个事件队列,当event loop执行到某个阶段时会将当前阶段对应的队列依次执行。当队列执行完毕或者执行的数量超过上线时,会转入下一个阶段。node事件环跟浏览器的事件环相似惟一不一样的是它是把队列的执行完才执行下个队列。(Node是按照六个阶段执行,每一个阶段切换时,再执行MicroTask微任务队列)测试
每个阶段都有一个装有callbacks的队列,当event loop运行到一个指定阶段时, node将执行该阶段的队列,当队列callback执行完或者执行callbacks数量超过该阶段的上限时, event loop会转入下一下阶段.线程
poll 阶段,是整个event loop中的最重要承接阶段:在node.js里,任何异步方法(除timer,close,setImmediate以外)完成时,都会将其callback加到poll queue里,并当即执行。3d
poll 阶段有两个主要的功能:cdn
若是event loop进入了 poll阶段,且代码未设定timer,将会发生下面状况:对象
一、若是poll queue不为空,event loop将同步的执行queue里的callback,直至queue为空,或执行的callback到达系统上限;blog
二、若是poll queue为空,将会发生下面状况:
三、若是poll queue进入空状态时(即poll 阶段为空闲状态),event loop将检查timers,若是有1个或多个timers时间时间已经到达,event loop将按循环顺序进入 timers 阶段,并执行timer queue.
以上即是整个event loop时间循环的各个阶段运行机制。
待会儿上测试代码~