浏览器事件循环
浏览器中的EventLoop是根据HTML5定义的规范来实现的,不同浏览器可能有不同的实现
事件队列
1.微任务队列(microstack queue)
- queueMicrotask
- Promise的then回调
- Mutation Observer API
2.宏任务队列(macrotask queue)
- 定时器(setTimeout,setInterval)
- ajax
- DOM监听
- UI Rendering
执行顺序
规范:在执行任何宏任务之前,都需要保证微任务队列已经被清空
Node事件循环
Node中EventLoop是由libuv库实现的
node执行js文件
- 先开启一个node进程(node进程拥有多线程)
- 其中 js线程 -> 执行js代码,其他线程同浏览类似处理不同异步任务
Node架构图
libuv中主要维护了一个EventLoop和worker threads(线程池)
EventLoop负责调用系统的一些其他操作:文件IO、Network、child-processes等
Tick阶段
定时器(Timers)
本阶段执行已经被setTimeout和setInterval的调度回调函数
待定回调(Pending Callback)
对某些系统操作(如TCP错误类型)执行回调
idle,prepare
仅系统内部使用
轮询(poll)
检索新的I/O事件;执行与I/O相关的回调;
检测(check)
setImmediate回调函数在这里执行
关闭的回调函数
一些关闭的回调函数,如socket.on(‘close’,…)
Node的事件队列
微任务队列
next tick queue
- process.nextTick
other queue
- Promise的then回调
- queueMicrotask
宏任务队列
timer queue
- setTimeout
- setInterval
poll queue
- IO事件
check queue
- setImmediate
close queue
- close事件
每次事件循环Tick中执行顺序
next tick queue
other queue
timer queue
poll queue
check queue
close queue
