一个完整的事件循环过程,可以概括为一下阶段:
# 事件循环
由于 js 是单线程的编程语言,同一时间只能做一件事情,所有任务都要排队一件一件完成。
事件循环分为同步任务和异步任务
同步任务就是主线程上排队执行的任务。只有当前任务执行完,才会执行下一个任务。
异步任务不进入主线程,而是进入任务队列的任务,只有任务队列通知主线程某个异步任务可以执行了,才会进入主线程执行这个任务。
任务队列又分为宏任务和微任务:
- 宏任务:script,setTimeout,setInterval
- 微任务:promise 的 then,MutationObserver
- 主线程执行同步代码
- 遇到宏任务添加到宏任务队列
- 遇到微任务添加到微任务队列
- 同步代码执行完毕,接下来会先清空微任务队列(回到 2、3)直到清空微队列
- 然后从宏队列取出一个任务(回到2,3,4)直到宏任务队列清空。
常见的宏任务:
- setTimeout
- setInterval
- setImmediate
- script 代码块
- I/O 操作。
常见的微任务:
- Promise.then()
- MutationObserver
- process.nextTick