1.宏队列
macrotask,也叫tasks。 一些异步任务的回调会依次进入macro task queue,等待后续被调用。这些异步任务包括:setTimeoutsetIntervalsetImmediate (Node独有)requestAnimationFrame (浏览器独有)I/OUI rendering (浏览器独有)
2.微队列
microtask,也叫jobs。 另一些异步任务的回调会依次进入micro task queue,等待后续被调用。这些异步任务包括:process.nextTick (Node独有)Promise.thenObject.observeMutationObserver(注:这里只针对浏览器和NodeJS)
3.浏览器的Event Loop和NodeJS的Event Loop
两者是不同的,实现机制也不一样,不要混为一谈。
3.1 浏览器的EventLoop
浏览器可以理解成只有1个宏任务队列和1个微任务队列,先执行全局Script代码,执行完同步代码调用栈清空后,从微任务队列中依次取出所有的任务放入调用栈执行,微任务队列清空后,从宏任务队列中只取位于队首的任务放入调用栈执行,注意这里和Node的区别,只取一个,然后继续执行微队列中的所有任务,再去宏队列取一个,以此构成事件循环。
3.2 NodeJS的EventLoop
NodeJS可以理解成有4个宏任务队列和2个微任务队列,但是执行宏任务时有6个阶段。先执行全局Script代码,执行完同步代码调用栈清空后,先从微任务队列Next Tick Queue中依次取出所有的任务放入调用栈中执行,再从微任务队列Other Microtask Queue中依次取出所有的任务放入调用栈中执行。然后开始宏任务的6个阶段,每个阶段都将该宏任务队列中的所有任务都取出来执行(注意,这里和浏览器不一样,浏览器只取一个),每个宏任务阶段执行完毕后,开始执行微任务,再开始执行下一阶段宏任务,以此构成事件循环。