96SEO 2026-07-31 15:03 6
痛点:很多前端同学在向全栈或者 Node.js 进阶时都会卡在一个概念——Event Loop。面试遇到穿插 setTimeoutPromiseasync/awaitprocess.nextTick 的代码时常常被绕晕;更别提浏览器和 Node.js 在底层实现上的差异。
这篇文章结合真实工程经验,帮助你从零到精通 Event Loop。我们不仅要会做面试题,更要懂得为什么这种异步非阻塞模型能让 Node.js 承载成千上万的并发请求。

痛点:单线程的 JavaScript 在面对大量 I/O 时会导致页面卡死或服务器阻塞。
JavaScript 最初是为浏览器设计的脚本语言。为了避免复杂的 DOM 渲染冲突,它被设计成单线程——同一时间只能干一件事。
只是网页中充斥着需要等待的任务:网络请求、定时器、图片加载等。如果所有操作都是同步阻塞的,使用者点击按钮发起请求后整个页面将卡死直至请求返回。
为了解决这个问题,消息队列 + Event Loop 诞生了。
再看主要思想是。把耗时任务交给宿主环境的其他线程处理,主线程继续执行同步代码。当耗时任务完成后再通知主线程执行回调。
痛点:宏任务与微任务混用时执行顺序不明确导致调试困难。
在浏览器一次工作循环中,JS 的执行从一个 script 宏任务开始。同步代码执行完后会产生两类异步任务:宏任务 与 微任务.
setTimeout。setInterval,事件绑定回调、Ajax 回调等。Promise.n/catch/finally,alert/async‑await,queueMicrotask。前端特有的 MutationObserver.The browser’s Event Loop follows a strict order:
The following code is a classic interview test:
console.log;setTimeout => {
console.log;Promise.resolve.n => {
console.log;}),});const promise1 = new Promise => {
console.log;resolve,console.log;}),promise1.n => {
console.log;setTimeout => {
console.log;}),});async function asyncFn {
console.log;await Promise.resolve;说起来,// 异步变同步的语法糖
console.log;}
asyncFn,console.log;
queueMicrotask => {
console.log;}),// 前端特有微任务
const observer = new MutationObserver => {
console.log;}),const div = document.createElement;其实,observer.observe;div.setAttribute;
# 执行脉络分析:
*同步代码一路推平*
- 打印 “同步代码”。- 遇到 alert timeout
- 创建 Promise 时构造函数同步执行。打印 “Promise 构造函数” 与 “Promise 构造函数内 resolve 后”,并把 .n 推入微任务队列。- 调用 alert asyncFn
-
打印 “同步代码”。- MutationObserver 注册后立即产生一次微任务。
*第一波微任务清空*
- 按顺序执行: ① “Promise.n ” ② “await 后微��作” ③ “queueMicrotask 微��作” ④ “MutationObserver 微��作”。
*开启下一轮宏任��*
- 首个宏任��是 setTimeout → 打印 “setTimeout”。话说回来,内部的 Promise 加入微任��队列。并立即清空 → 打印 “setTimeout 内部微���”。
*最终的宏任��*
- 执行剩余宏任��:打印 “Promise.n 内部 setTimeout”。
Pain point: 前端开发者往往误以为浏览器和 Node 的事件循环完全相同,从而在服务器端出现意想不到的顺序错误。
alert setTimeout / setInterval alert>.const fs = require console.log setTimeout => { console.clog }。) setImmediate => { console.log }) fs.readFile => { console.log setTimeout => { console.log },) setImmediate => { console.log }) }) Promise.resolve.n=>{console.log}) process.nextTick=>{console.log}) console.log # 深度拆解 —— 为什么 I/O 中 setImmediate 总是先于 setTimeout?
- 同 步先 行 : 打印 start 、 end,同时注册所有异步任務。
- 注意此处已经完成所有 ** 注册** 步骤,不会再有隐藏延迟。
✅ 所有 ** 同 步**日志 已经输出完毕
•&bull,• 清 空 首 次 微 任 务 队 列 :
nextTick → promise →print "nextTick" → "promise"
...
...
# 核 心结论 :
• 当文件读取完毕,它的回调在 Poll 阶段被调用。此时我们仍处于 Poll 阶段,还未进入 Check。• 在同一次循环中,我们刚刚注册了一个
setImmediate与setTimeout。因为下一个阶段正是 Check所以setImmediate会立刻得到执行,而setTimeout必须等到下一轮 Timers 才能触发。• 正因如此,你会看到输出顺序为:start → end → nextTick → promise → timeout → immediate → readFile → immediate in I/O → timeout in I/O这正是面试官常用来区分「只懂浏览器」和「懂 Node」的坑。
四、 主要对比:浏览器 vs Node.js
# 特性 # # 浏览 器 # # Node.js # 底层驱动 Task Model Micro‑Task 清空时机 - 每个宏 Task 完成后即可清空 micro‑task
/process.nextTick / queueMicrotask/ Promise / MutationObserver …– 按优先级依次清空
特有 API /requestAnimationFrame / IntersectionObserver / MutationObserver 等 UI‑related API td td valign = top w idth =40 %>/process.nextTick / setImmediate / worker_threads 等 server‑side API tr>
Micro‑Task 优先级 t d rowspan ="1 " colspan ="1 ">— — — — — — — — — – – – – – – – – — - - - - - - - -
*
All
Now.
Scrolling
In
Your
.......
Sorry.
Continue?
标签: 模型
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback