6.Node与浏览器EventLoop的差异

任务队列个数不同

浏览器事件环有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与浏览器的区别,就是nodejs的 宏任务 分好几种,而这好几种又有不同的 任务队列,而不同的 任务队列 又有顺序区别,而 微任务是穿插在每一种【注意不是每一个!】宏任务 之间的

Timers 类型的宏任务队列

setTimeout()

setInterval

Check 类型的宏任务队列

setImmediate()

Close callback 类型的宏任务队列

socket.on(‘close’, () => {})

Poll 类型的宏任务队列

除了上面几种的其他所有回调

nodeJs 里面的微任务队列

process.nextTick() Promise.then()

process.nextTick()的优先级高于所有的微任务,每一次清空微任务列表的时候,都是先执行 process.nextTick()

posted @ 2023-03-04 20:30  不想做混子的奋斗远  阅读(29)  评论(0)    收藏  举报