任务队列个数不同
浏览器事件环有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()
标签:Node,回调,浏览器,NodeJS,队列,EventLoop,任务,执行 From: https://www.cnblogs.com/alwaysrun/p/17179010.html