浏览器和 nodejs 的事件循环有什么区别?

36 阅读1分钟

单线程

  • JS 是单线程的(无论浏览器还是 nodejs)

  • 浏览器中的 JS 执行和 DOM 渲染公用一个线程

异步 - 宏任务和微任务

  • 宏任务,如:setTimeout、setInterval、网络请求

  • 微任务,如:promise、async/await、MutationObserver(监听 dom 树的变化)

  • 微任务在下一轮 dom 渲染前执行,宏任务在之后执行(微任务要比宏任务执行的更早一些)

nodejs 异步

  • nodejs 同样使用了 ES 语法,也是单线程,也需要异步

  • 异步任务也分:宏任务 + 微任务

  • 但是,它的宏任务和微任务,分不同的类型,有不同优先级

nodejs 宏任务类型和优先级(优先级高到低)

  • Timers - setTimeout setInterval

  • I/O callbacks - 处理网络、流、TCP 的错误回调

  • Idle, prepare - 闲置状态(nodejs 内部使用)

  • Poll 轮询 - 执行 poll 中的 I/O 队列

  • Check 检查 - 存储 setImmediate 回调

  • Close callbacks - 关闭回调,如 socket.on("close")

nodejs 微任务类型和优先级

  • 包括:promise、async/await、process.nextTick

  • 注意,process.nextTick 优先级最高

nodejs event loop

  • 执行同步代码

  • 执行微任务(process.nextTick 优先级更高)

  • 按顺序执行 6 个类型的宏任务(每个开始前都执行当前的微任务)