事件循环、宏任务、微任务一网打尽(附超多经典面试题)( 四 )


事件循环、宏任务、微任务一网打尽(附超多经典面试题)
本文插图
2.宏任务微任务的执行机制不同
(1)node11之前1)执行完一个阶段所有同类型的宏任务2)执行完nextTick队列里面的内容3)然后执行完微任务队列的内容 , (2)Node11之后宏任务和微任务的执行结果 , 跟浏览器一致了;

  • 执行首个宏任务 -> 执行这个宏任务中的所有微任务 -> event loop执行完毕 , 执行下一个eventloop

实际底层的原理不一样 , node中的流程如下:
事件循环、宏任务、微任务一网打尽(附超多经典面试题)
本文插图
  • Node.js中可以理解为4种宏任务队列和2种微任务队列 , 但是执行宏任务时有6个阶段 。 4种宏任务队列:setTimeout 、setInterval 、setImmediate、I/O包括文件和网络2种微任务队列:process.nextTick、 new Promise.then 回调
  • Node.js中 , 先执行全局Script代码
  • 执行完同步代码后 , 先从微任务队列Next Tick Queue中取出所有的任务放入调用栈中执行
  • 再从微任务队列Other Microtask Queue依次取出所有的任务放入调用栈中执行 。
  • 然后开始宏任务的6个阶段 , 每个阶段都把宏任务队列中所有任务取出来执行 ,在执行下一阶段的宏任务 , 每一个宏任务完成执行完该宏任务的微任务队列 , 以此来构成事件循环 。

3.相同点
(1)事件循环event loop的目的:处理同步和异步事件的一种事件调度机制;(2)循环是没有终点的 , 只要进程在 , 就会有新任务 , 就会去执行;
二.事件循环的六个阶段
官网的图
事件循环、宏任务、微任务一网打尽(附超多经典面试题)
本文插图
1.timers定时器:
(1)本阶段执行 setTimeout 和 setInterval 的回调函数 。 (2)事件循环的起点:node服务器启动、setTimeout 和 setInterval 的回调函数、I/O回调函数;
2.pending callbacks:
本阶段执行某些系统操作(比如TCP错误类型)的回调函数;
3.idle, prepare:仅系统内部使用 。
4.poll 轮询:
(1)主要处理异步 I/O 的回调 , 以及除了timers之外几乎所有的回调函数;其余情况 node会在适当时候在此处阻塞 。 (2)异步I/O分为:网络I/O和文件I/O;
poll 是一个至关重要的阶段 , 这一阶段中 , 系统会做两件事情1.回到 timer 阶段执行回调2.执行 I/O 回调(1)在进入该阶段时如果 没有 设定 timer 的话 , 会发生以下两件事情