为什么主线程上的同步 XMLHttpRequest 被废弃并应避免使用?
围绕“为什么主线程上的同步 XMLHttpRequest 被废弃并应避免使用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出同步请求冻结主线程 UI 与事件循环、浏览器已计划移除支持。
事件循环专题面试题第 1 页,显示第 1–28 题,共找到 28 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“为什么主线程上的同步 XMLHttpRequest 被废弃并应避免使用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出同步请求冻结主线程 UI 与事件循环、浏览器已计划移除支持。
本题解释 Web Worker 不阻塞主线程的原因:独立线程与事件循环、结构化克隆消息通信,结合场景与边界说明其实践条件与限制。
围绕“Worker 里的事件循环和主线程的事件循环是完全独立的吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕每个独立全局都有独立事件循环,说明不会相互阻塞。
本文解释 Worker.terminate() 的强制终止机制,包括对运行中任务、事件循环、资源清理的影响,并比较与正常结束的区别,给出工程场景和边界条件。
围绕“dispatchEvent 是同步派发还是异步派发?在监听器中修改 DOM 会立即反映吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明调用 dispatchEvent 后所有监听器立即同步执行,且事件循环可以嵌套。
围绕“浏览器在派发事件时是创建新 Event 对象还是复用同一个?对监听器有什么潜在影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明每个事件派发都会创建新对象(除非手动复用),但事件循环中变量引用可能失效。
围绕“DataLoader 如何通过批处理解决 GraphQL 的 N+1 问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要讲清清同一事件循环 tick 内 key 合并成一次查询的机制。
以浏览器 Event Loop 为范围,逐步分析同步代码、Promise、queueMicrotask 与 setTimeout 的执行顺序,讲清微任务检查点、渲染时机与常见面试误区。
解释 detached 的平台差异、unref 对父事件循环引用的影响和 stdio 连接的责任,说明它们不提供守护重启或资源管理,并给出后台任务应交给进程管理器的判断依据。
说明同步子进程阻塞当前 Node 线程事件循环的范围,区分 spawnSync 返回结果与 execSync 抛错,并纠正 timeout 一定按时返回的误解,给出 CLI、启动任务和服务请求的选择依据。
围绕“不引入 worker_threads 时如何把一个长 CPU 计算拆小避免阻塞事件循环”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出用 setImmediate/定时器把循环切片让出事件循环及其与 Worker 方案的性能差距。
围绕“设计 Node.js 接口服务时如何判断一个任务应该卸载到 Worker 线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出按任务耗时与调用频率评估对事件循环的影响、给出生成器分片/Worker 的取舍标准。
围绕“在 Worker 线程中 AsyncLocalStorage 等异步上下文能否跨线程传递”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出每个 Worker 有独立事件循环与上下文、跨线程传递需显式携带数据。
围绕“为什么 Node.js 的 CPU 密集任务应该放到 worker_threads 而不是主线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出单线程事件循环被长计算阻塞会拖垮所有请求、Worker 利用多核并行。
结合事件循环延迟、CPU 栈和请求阶段耗时定位 Node.js 卡顿,给出 monitorEventLoopDelay 的纳秒转毫秒示例,说明统计窗口、采样局限和下游等待不能混为同一根因。
说明事件循环 close callbacks 只涉及部分资源关闭回调,区分 socket 生命周期、普通 EventEmitter 同名事件和自定义流实现,避免从事件名字推导固定阶段或业务成功。
围绕“JSON.parse 一个超大请求体为什么也会阻塞 Node.js 事件循环,有哪些缓解方式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 JSON 解析是同步 CPU 操作且给出流式解析或限制体积等方案。
围绕“如何用 perf_hooks 的 monitorEventLoopDelay 量化 Node.js 事件循环延迟”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明启用 histogram、读取 mean/p99 等指标并解读 lag 含义。
通过分段求和示例展示如何保存游标与累计结果、在片段间安排 setImmediate,说明首片仍同步执行、总复杂度不变,以及片段预算、取消和不可拆分计算的限制。
按回调职责解释 timers、pending callbacks、idle/prepare、poll、check 和 close callbacks,说明 libuv 1.45 后的定时器调整,并区分阶段图、nextTick 和 Promise 微任务。
围绕“Node.js 进程什么时候自然退出?哪些未决的句柄或定时器会阻止退出”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释事件循环在无可执行回调且无 ref 句柄时退出,及 unref 的作用。
围绕“Node.js 的 setTimeout 为什么无法保证精确的毫秒级触发,最小延迟和影响因素有哪些”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明事件循环调度与其他阶段耗时造成延迟下限,而非承诺精确唤醒。
围绕“Node.js 中每个事件循环阶段结束后微任务队列是如何被清空的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明每个阶段回调执行完即清空 nextTick 与微任务队列,而非整个循环结束才执行。
围绕“Node.js 如何度量事件循环延迟(event loop lag),该指标升高说明服务出了什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 setInterval 偏差或 monitorEventLoopDelay 的度量方式及升高的含义(同步阻塞/GC)。
围绕“Node.js 服务进程退出码(0/1 及 process.exitCode 与 process.exit())应该”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明设置 exitCode 让事件循环自然排空优于立即 exit()(避免截断异步写)。
围绕“Node.js 进程句柄(handle)泄漏导致无法退出,如何用 process._getActiveHandles”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明活动句柄/请求阻止事件循环退出的机制与定位手段。
围绕“eventfd 和 timerfd 为什么经常出现在 epoll 程序里,它们解决了什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明将线程间通知与定时器统一为 fd 以纳入单事件循环。
围绕“非阻塞 fd 上 read 返回 EAGAIN 后正确的事件循环写法是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 EAGAIN 表示暂无可读而非错误,以及边缘触发下必须读到 EAGAIN 为止。