Event Loop 在浏览器和 Node.js 中的区别

Event Loop 在浏览器和 Node.js 中的区别_第1张图片

前端开发工程师、技术日更博主、已过CET6
阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 一、事件循环的阶段
      • 浏览器
      • Node.js
    • 二、微任务队列的处理
      • 浏览器
      • Node.js
    • 三、`setImmediate` 和 `process.nextTick`
      • 浏览器
      • Node.js
    • 四、总结

虽然浏览器和 Node.js 都使用事件循环机制来处理异步操作,但它们在实现细节上存在一些差异。

一、事件循环的阶段

浏览器

浏览器的事件循环主要包括以下几个阶段:

  1. Timers:执行 setTimeoutsetInterval 的回调。
  2. Pending Callbacks:执行一些系统操作的回调,如 TCP 错误。
  3. Idle, Prepare:仅在内部使用。
  4. Poll:检索新的 I/O 事件;执行与 I/O 相关的回调(除了关闭回调、定时器调度的回调和 setImmediate 之外,几乎所有回调都在这里执行)。
  5. Check:执行 setImmediate 的回调。
  6. Close Callbacks:执行一些关闭的回调,如 socket.on('close', ...)

Node.js

Node.js 的事件循环也包括几个阶段,但与浏览器有所不同:

  1. Timers:执行 setTimeoutsetInterval 的回调。
  2. Pending Callbacks:执行一些系统操作的回调。
  3. Idle, Prepare:仅在内部使用。
  4. Poll:检索新的 I/O 事件;执行与 I/O 相关的回调。
  5. Check:执行 setImmediate 的回调。
  6. Close Callbacks:执行一些关闭的回调。

二、微任务队列的处理

浏览器

在浏览器的事件循环中,微任务(如 Promisethen/catch/finally)在每个宏任务执行完毕后立即执行,直到微任务队列为空。

Node.js

在 Node.js 中,微任务的处理略有不同。在每个阶段之间,Node.js 会检查并执行微任务队列中的所有微任务,但 process.nextTick 的回调会在当前操作完成后立即执行,优先级高于其他微任务。

三、setImmediateprocess.nextTick

浏览器

浏览器不支持 setImmediate,但可以使用 setTimeout(fn, 0) 来模拟。

Node.js

Node.js 支持 setImmediate,它会在当前事件循环的 Check 阶段执行。process.nextTick 是 Node.js 特有的,它会在当前操作完成后立即执行,优先级高于其他微任务。

四、总结

虽然浏览器和 Node.js 的事件循环机制在概念上是相似的,但在实现细节上存在一些差异,特别是在微任务的处理和特定 API 的支持上。了解这些差异有助于在不同的运行环境中编写更高效的异步代码。

你可能感兴趣的:(node.js,前端)