Node.js事件循环通过libuv实现,按顺序执行timers、pending callbacks、poll、check、close callbacks六个阶段,同步代码先执行,process.nextTick在阶段切换前优先执行,微任务(如Promise)在阶段结束后执行,宏任务(如setTimeout、setImmediate)按阶段处理,I/O操作主要在poll阶段完成,从而实现非阻塞异步编程。

Node.js 的事件循环机制是理解其非阻塞 I/O 和异步编程模型的核心。虽然 JavaScript 本身是单线程的,但 Node.js 借助事件循环和底层的 libuv 库,实现了高效的并发处理能力。下面直接说明其工作原理和关键阶段。
事件循环不是 JavaScript 自带的,而是由运行环境(如浏览器或 Node.js)提供的。在 Node.js 中,事件循环由 libuv 实现,负责调度异步操作的回调执行。
它的核心职责是:不断检查是否有待处理的事件(如 I/O 完成、定时器触发等),如果有,就将对应的回调函数加入调用栈执行。
Node.js 的事件循环分为六个主要阶段,每个阶段按固定顺序执行:
立即学习“Java免费学习笔记(深入)”;
setTimeout() 和 setInterval() 设置的到期回调。setImmediate() 设置的回调。它通常用于在 poll 阶段结束后立即执行某些操作。socket.on('close', ...)。除了上述六个阶段,Node.js 还处理两类“任务”:
setTimeout、setInterval、I/O 操作、setImmediate 等,它们在事件循环的各个阶段中被处理。Promise.then、process.nextTick。它们在每个阶段结束后立即执行,优先级高于下一个宏任务。注意:process.nextTick() 虽然常被归为微任务,但它实际上在每个阶段切换前执行,甚至早于 Promise 微任务,因此具有最高优先级,滥用可能导致 I/O 饥饿。
看一段代码:
<font face="monospace">
setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
Promise.resolve().then(() => console.log('promise'));
process.nextTick(() => console.log('nextTick'));
console.log('sync');
</font>
输出顺序通常是:
<font face="monospace"> sync nextTick promise timeout immediate </font>
解释:
sync 是同步代码,最先执行。nextTick 在当前操作完成后、进入事件循环前执行。Promise 回调属于微任务,在本轮事件循环末尾执行。setTimeout 在 timers 阶段执行。setImmediate 在 check 阶段执行,通常晚于 setTimeout(0),但受启动时机影响,有时可能先执行。基本上就这些。掌握事件循环的关键是理解阶段顺序和任务优先级,避免滥用高优先级微任务阻塞正常 I/O。
以上就是服务端JavaScript_Node.js事件循环机制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号