>[danger]浏览器的Eventloop 和 node的Eventloop区别 浏览器和 Node.js 中的 Event Loop 都是 JavaScript 运行环境的一部分,但它们之间存在一些区别。 1. 实现方式不同 在浏览器中,Event Loop 是由浏览器内核提供的。在不同的浏览器中,实现方式可能会有所不同。 在 Node.js 中,Event Loop 是由 libuv 库提供的。 2. 宏任务和微任务不同 在浏览器中,事件循环中分为宏任务(macro-task)和微任务(micro-task)。 - 宏任务包括 script(整体代码)、setTimeout、setInterval、I/O、UI 交互事件等等。 - 微任务包括 Promise.then()、MutaionObserver、process.nextTick(Node.js 中独有)等等。 在 Node.js 中,事件循环中也存在宏任务和微任务。但是微任务它仅有 process.nextTick 和 Promise ,即 Node.js 中没有像浏览器中的 MutationObserver 类似的 API 可以用于创建微任务。 3. 触发时机不同 在浏览器中,每一个时间循环 Tick 的执行顺序通常为: - 执行一个宏任务(栈中没有就从事件队列中获取) - 执行过程中如果遇到了微任务,就将它添加到微任务的任务队列中 - 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行) - 当前 Tick 执行完毕,开始检查渲染,然后 GUI 线程接管渲染 - 渲染完毕之后,JS 线程继续接管,开始下一个 Tick,重复上述步骤 在 Node.js 中,事件循环的执行顺序如下: - timers 阶段:执行 setTimeout() 和 setInterval() 设定的时间回调函数。 - pending callbacks 阶段:执行系统级别操作的回调函数(例如完成 TCP 连接后的回调函数) - idle, prepare 阶段:仅 node 内部使用。 - poll 阶段:获取新的 I/O 事件,执行与 I/O 相关的回调函数 (除了 close 事件,它有自己的处理方式,不在这个阶段处理)。 - check 阶段:执行 setImmediate() 回调函数。 - close callbacks 阶段:执行 socket、文件等关闭的回调函数。 可以看出,在浏览器中,每个事件循环 Tick 都会执行完所有微任务再次执行宏任务;而在 Node.js 中,则是在每个阶段执行完毕后才开始执行微任务,即微任务会在每个阶段之间执行。同时,Node.js 还有一个与浏览器不同的 setImmediate() API,它会在当前阶段结束后立即执行回调函数。 总结:虽然浏览器和 Node.js 中的 Event Loop 都是 JavaScript 运行环境的一部分,但它们之间存在一些区别。比如宏任务和微任务的定义不同、触发时机不同等。因此,在编写跨平台 JS 代码时,需要注意其兼容性问题。