参考
JavaScript 中的 Event Loop(事件循环)机制
什么是 Event-Loop
JS 是单线程执行的,所以要执行多任务的话依赖于异步和事件循环(Event Loop)。JS 是单线程的,指的是 JS 引擎线程。在浏览器环境中,有 JS 引擎线程和渲染线程,且这两个线程互斥。node 环境中,只有 JS 引擎线程。
JS 引擎常驻内存,等待宿主(浏览器或 node)分配宏任务,反复等待-执行即为事件循环。
Event Loop 中,每次循环称为 tick,每次 tick 的任务如下:
- 读宏任务队列,执行其同步代码直至结束,这个过程中可能会有宏任务和微任务入队
- 读微任务,并执行,直至微任务队列为空
- 如果宿主为浏览器,可能会渲染页面
ES6 规范中,microtask 称为 jobs,macrotask 称为 task。宏任务是由宿主发起的,而微任务由 JavaScript 自身发起。
在 ES3 以及以前的版本中,JavaScript 引擎自身没有发起异步请求的能力,也就没有微任务的存在。在 ES5 之后,JavaScript 引入了 Promise,这样,不需要浏览器,JavaScript 引擎自身也能发起异步任务了。
1 | // async function async1() { |
1 | new Promise(resolve => { |
setTimeout
回调函数是宏任务,Promise.then
的回调函数是微任务new Promise
的 executor 函数是同步执行的then
需等new Promise
的 executor 函数执行完,或上一个 then 执行完,才入队