浏览器环境的事件循环机制

203 阅读1分钟

js执行为单线程(不考虑web worker),所有代码皆在主线程调用栈完成执行。当主线程任务清空后才会去轮询取任务队列中任务。

任务队列

异步任务分为task(宏任务,也可称为macroTask)和microtask(微任务)两类。 当满足执行条件时,task和microtask会被放入各自的队列中等待放入主线程执行,我们把这两个队列称为Task Queue(也叫Macrotask Queue)和Microtask Queue。

姑且把宏任务叫做主任务

  • 主任务:script中代码、setTimeout、setInterval、I/O、UI render。
  • 微任务: promise、Object.observe、MutationObserver。

具体过程

  1. 执行完主执行线程中的任务。
  2. 取出Microtask Queue中任务执行直到清空。
  3. 取出Macrotask Queue中一个任务执行。
  4. 取出Microtask Queue中任务执行直到清空。
  5. 重复3和4。

同步完成后,一个宏任务,所有微任务,一个宏任务,所有微任务......