JS事件环eventloop

top
事件环分为浏览器事件环和nodejs事件环

浏览器中的事件环

浏览器事件环

浏览器事件环简单直接:当前栈执行完成(同步代码主线程上执行完成)->清空微任务->宏任务队列中的第一项推到栈中执行(若是有微任务,将微任务放入微任务队列)->清空微任务队列->宏任务第二项任务执行,依此循环,直到结束。node

微任务:Promise.then/mutationObesrve(process.nextTick是node才有的) 宏任务:setTimeout、setInterval、setTmmediate(只兼容ie)、messageChannel浏览器

二、node的事件环

event loop的事件处理机制的运做方式。异步

当Node.js启动时会初始化event loop, 每个event loop都会包含按以下顺序六个循环阶段,oop

  • 一、在libuv内部有这样一个事件环机制。在node启动时会初始化事件环。
  • 二、node中的event loop分为6个阶段,不一样于浏览器的是,这里每个阶段都对应一个事件队列,node会在当前阶段中的所有任务执行完,清空NextTick Queue,清空Microtask Queue,再执行下一阶段。
  • 三、在node.js里,process 对象表明node.js应用程序,能够获取应用程序的用户,运行环境等各类信息。process.nextTick()方法将 callback 添加到next tick 队列,而且nextTick优先级比Promise.then等微任务高。
    node事件环

每个阶段都对应一个事件队列,当event loop执行到某个阶段时会将当前阶段对应的队列依次执行。当队列执行完毕或者执行的数量超过上线时,会转入下一个阶段。node事件环跟浏览器的事件环相似惟一不一样的是它是把队列的执行完才执行下个队列。(Node是按照六个阶段执行,每一个阶段切换时,再执行MicroTask微任务队列)测试

每个阶段都有一个装有callbacks的队列,当event loop运行到一个指定阶段时, node将执行该阶段的队列,当队列callback执行完或者执行callbacks数量超过该阶段的上限时, event loop会转入下一下阶段.线程

poll 阶段

poll 阶段,是整个event loop中的最重要承接阶段:在node.js里,任何异步方法(除timer,close,setImmediate以外)完成时,都会将其callback加到poll queue里,并当即执行。3d

poll 阶段有两个主要的功能:cdn

  • 处理poll队列(poll quenue)的事件(callback);
  • 执行timers的callback,当到达timers指定的时间时;

若是event loop进入了 poll阶段,且代码未设定timer,将会发生下面状况:对象

  • 一、若是poll queue不为空,event loop将同步的执行queue里的callback,直至queue为空,或执行的callback到达系统上限;blog

  • 二、若是poll queue为空,将会发生下面状况:

    • 若是代码已经被setImmediate()设定了callback, event loop将结束poll阶段进入check阶段,并执行check阶段的queue (check阶段的queue是 setImmediate设定的)
    • 若是代码没有设定setImmediate(callback),event loop将阻塞在该阶段等待callbacks加入poll queue; 若是event loop进入了 poll阶段,且代码设定了timer:
  • 三、若是poll queue进入空状态时(即poll 阶段为空闲状态),event loop将检查timers,若是有1个或多个timers时间时间已经到达,event loop将按循环顺序进入 timers 阶段,并执行timer queue.

以上即是整个event loop时间循环的各个阶段运行机制。

待会儿上测试代码~

相关文章
相关标签/搜索