说说 JS 的事件循环机制,node事件循环机制 ?
执行js代码时,遇到同步任务,直接推入调用栈执行,遇到异步任务,将该任务挂起,等到有返回结果后放到任务队列中;
当调用栈中的任务全部执行完成后,这时开始事件循环(Eventloop),不断的访问任务队列,将其中的任务推到调用栈中执行.
事件循环的大致过程:
- 清空调用栈中的同步代码
- 执行微任务队列中的微任务
- 渲染dom
- 触发事件循环,不断询问任务队列中是否有要执行的语句,有则调入调用栈中执行
异步任务又分为微任务和宏任务,微任务优先级高于宏任务,微任务在dom渲染前触发,宏任务在dom渲染后触发
宏任务:setTimeout,setInterval,Ajax
微任务:Promise,async/await
node事件循环一6个阶段称为一轮循环
- 定时器检测阶段(timer):在这个阶段执行timer的回调,即setTimeout,setInterval里的回调函数
- I/O事件回调阶段:此阶段会执行所有的回调函数,处理close,callback(关闭回调)和那些有timer,setImmediate调度的回调
- 限制阶段:系统内部处理的事务
- 轮询阶段(poll):检索新的I/O事件,执行与I/O相关的回调,其余情况node将在适当时候堵塞
- 检查阶段(check):setImmediate()函数在此执行
- 关闭事件回调阶段(close,callback):一些关闭的回调函数
关于poll阶段
- 如果进入poll阶段,且代码未设定timer
- 如果poll队列不为空,系统将同步执行队列里的callback直到队列为空或者执行的callback达到系统上限
- 如果poll队列为空
- 如果代码已经被setImmediate设定了callback,事件循环将进入check阶段,执行check阶段队列
- 如果代码没有被setImmediate设定callback,事件循环将在此阶段阻塞直到callback加入poll队列,一旦进入就立即执行
- 如果poll阶段处于空闲状态,那么事件循环将检查timer,如果有一个或多个timer已经到达,事件循环将按顺序进入timer阶段并执行timer队列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用