文章目录
任务队列个数不同
- 浏览器事件环有2 个事件队列
- 宏任务队列
- 微任务队列
- NodeJS 事件环有6 个事件队列
- 定时器(
timers
):本阶段执行已经被 setTimeout() 和 setInterval() 的回调函数 - 待定回调(
pending callbacks
):执行延迟到下一个循环迭代的 I/O 回调。 idle, prepare
:仅系统内部使用- 轮询(
poll
):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞。 - 检测(
check
):setImmediate() 回调函数在这里执行。 - 关闭的回调函数(
close callbacks
):一些关闭的回调函数,如:socket.on(‘close’, …)。
- 定时器(
NodeJS中的EventLoop与浏览器的EventLoop之间的区别
- 浏览器:先执行 一个 宏任务,然后执行所有微任务……循环往复
- NodeJS:先执行一种 宏任务 在执行清空微任务 再一种 宏任务 在执行清空微任务 再一种 宏任务 在执行清空微任务 所有种类宏任务结束 … 循环往复
微任务队列不同
- 浏览器事件环中有专门存储微任务的队列
- NodeJS 事件环中没有专门存储微任务的队列
微任务执行时机不同
- 浏览器事件环中每执行完一个宏任务都会去清空微任务队列
- NodeJS 事件环中只有同步代码执行完毕和其它队列之间切换的时候会去清空微任务队列
微任务优先级不同
- 浏览器事件环中如果多个微任务同时满足执行条件,采用先进先出
- NodeJS 事件环中如果多个微任务同时满足执行条件,会按照优先级执行
浏览器的event loop 执行顺序
- 是当执行栈 遇到异步任务将其放在异步队列中
- 异步队列分为两种 宏任务和微任务
- 当执行栈为空时,首先会将微任务全部取出来执行,此时微任务进入执行栈
- 当执行栈为空,且微任务为空时,从宏任务中取出最早的一个任务,放入执行栈
NodeJS中的EventLoop
其实nodejs与浏览器的区别,就是nodejs的 宏任务 分好几种,而这好几种又有不同的 任务队列,而不同的 任务队列 又有顺序区别,而 微任务是穿插在每一种【注意不是每一个!】宏任务 之间的
-
Timers 类型的宏任务队列
- setTimeout()
- setInterval
-
Check 类型的宏任务队列
- setImmediate()
-
Close callback 类型的宏任务队列
- socket.on(‘close’, () => {})
-
Poll 类型的宏任务队列
- 除了上面几种的其他所有回调
- nodeJs 里面的微任务队列
- process.nextTick() Promise.then()
- process.nextTick()的优先级高于所有的微任务,每一次清空微任务列表的时候,都是先执行 process.nextTick()