node事件循环跟浏览器事件循环区别蛮大
node的事件循环
执行js代码的线程只有一个,即主线程,依赖于定时器线程、http异步线程等线程实现了整个事件循环 当js主线程的执行栈为空时,会走一个事件循环。
- timer阶段(存放定时器)
- poll阶段(i/o操作[http请求,文件读写,数据库操作])
- check阶段(setImmediate)
事件循环开始时,会先依次执行当前timer阶段的任务队列。如果在此期间产生timer、poll、check任务,则将其加入到下一个对应阶段的任务队列。
执行事件循环的每一个任务之前,都会走一个子循环。
子循环:执行完nextTick队列中的所有任务,如果在此期间产生了nexttick或者微任务,将其推入到对应的队列中,并继续执行新加入的nextTick队列。直到nextTick队列为空,则执行微任务,如果微任务产生了nextTick或者微任务。将其加入到对应的队列中,并执行完所有的微任务。直到微任务为空,此时再看看nextTick是否为空,如果不为空,重复刚刚的操作。如果为空,则执行事件循环的任务。