基本
同级别任务先进队列先执行,IntersectionObserver总是在延时队列之后执行
顺序如下
以下是在Chrome上解析测试,不同版本,不同浏览器有细微差别
-
queueMicrotask(微队列任务)
-
Promise (微队列任务)
-
MutationObserver(微队列任务)
-
setTimeout(延时队列任务)
-
MessageChannel(与延时队列同级别任务)
-
requestAnimationFrame(与延时队列同级别任务,但和帧相关)
-
ResizeObserver(与延时队列同级别任务,但和帧相关)
-
IntersectionObserver(总是在宏任务之后)
-
requestIdelCallback
特殊情况
requestIdleCallback
的回调总是在浏览器空闲时期被调用,如果设置第二个参数{timeout:100}
,那么它的执行时机是当这个超时时间到达前,回调函数会被加入队列排队,如果第二个参数设置的足够小{timeout:1}
(设置0被认为是没有设置),它可能排在其他宏任务(和延时队列任务同级别)之前(不可能在微任务之前,微队列任务的优先级最高)
也就是说,requestIdleCallback
可能在setTimeout之前
Node
- setImmediate
- process.nextTick