Skip to main content

任务优先级

任务没有优先级 在消息队列里面排队 任务执行的时候先进先出。

消息队列是有优先级的

根据 W3C 的最新解释

  • 每个任务都有一个任务类型,同一个类型的任务必须在同一个队列 (用户的点击事件需要放在同一个队列里面) 不同类型的任务可以分属于不同的队列
  • 在一次事件循环中 浏览器可以根据实际情况从不同的队列里面取出任务执行
  • 浏览器必须准备好一个微队列 微队列里面的任务优先任务执行

在目前 chrome 的实现中 至少包含了以下队列

  • 延迟队列 用于存放计时器到达后的回调任务 优先级【中】(setInterval、setTimeout)
  • 微队列 存放需要最快执行的任务 优先级【最高】(Promise,async)
  • 交互队列 用于存放用户操作后产生的事件处理任务 优先级【高】(addEventListener)
tip

添加任务到微队列的主要是使用 Promise,MutationObserver

//立即把fn放到微队列
Promise.resolve().then(fn);
tip

总结:什么叫 JS 的事件循环

在 chrome 的渲染主线程 最开始会开启一个无限循环 每一次循环都会从消息队列里面取第一个任务出来执行 其他的线程可以在合适的时候向消息队列末尾加入任务即可

根据 W3C 的最新解释每个任务都有不同的类型,同类型的任务必须在同一个队列 不同的任务可以属于不同的队列 不同任务队列有不同的优先级 在一次事件循环中 有浏览器决定 执行哪一个队列里面的任务 但是浏览器里面必须要有一个微队列 微任务队列具有最高的优先级 必须优先调度执行