说说 JS 的事件循环机制,node事件循环机制 ?

执行js代码时,遇到同步任务,直接推入调用栈执行,遇到异步任务,将该任务挂起,等到有返回结果后放到任务队列中;

当调用栈中的任务全部执行完成后,这时开始事件循环(Eventloop),不断的访问任务队列,将其中的任务推到调用栈中执行.

事件循环的大致过程:

  1. 清空调用栈中的同步代码
  2. 执行微任务队列中的微任务
  3. 渲染dom
  4. 触发事件循环,不断询问任务队列中是否有要执行的语句,有则调入调用栈中执行

 

异步任务又分为微任务和宏任务,微任务优先级高于宏任务,微任务在dom渲染前触发,宏任务在dom渲染后触发

宏任务:setTimeout,setInterval,Ajax

微任务:Promise,async/await

 

node事件循环一6个阶段称为一轮循环

  1. 定时器检测阶段(timer):在这个阶段执行timer的回调,即setTimeout,setInterval里的回调函数
  2. I/O事件回调阶段:此阶段会执行所有的回调函数,处理close,callback(关闭回调)和那些有timer,setImmediate调度的回调
  3. 限制阶段:系统内部处理的事务
  4. 轮询阶段(poll):检索新的I/O事件,执行与I/O相关的回调,其余情况node将在适当时候堵塞
  5. 检查阶段(check):setImmediate()函数在此执行
  6. 关闭事件回调阶段(close,callback):一些关闭的回调函数

关于poll阶段

  • 如果进入poll阶段,且代码未设定timer
  • 如果poll队列不为空,系统将同步执行队列里的callback直到队列为空或者执行的callback达到系统上限
  • 如果poll队列为空
    • 如果代码已经被setImmediate设定了callback,事件循环将进入check阶段,执行check阶段队列
    • 如果代码没有被setImmediate设定callback,事件循环将在此阶段阻塞直到callback加入poll队列,一旦进入就立即执行
  • 如果poll阶段处于空闲状态,那么事件循环将检查timer,如果有一个或多个timer已经到达,事件循环将按顺序进入timer阶段并执行timer队列
posted @   天青色等烟雨灬  阅读(88)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示