EventLoop
参考:
1 宏任务队列
一些异步任务的回调会依次进入这个队列。
这些异步任务包括:
- setTimeout
- setInterval
- setImmediate (Node独有)
- requestAnimationFrame (浏览器独有)
- I/O
- UI rendering (浏览器独有)
2 微任务队列
另一些异步任务的回调会进入微任务队列。
这些异步任务包括:
- process.nextTick (Node独有)
- Promise
- Object.observe
- MutationObserver
3 执行流程
- 执行全局Script同步代码
- 依次从微任务队列取出队首的任务,放入调用栈执行,直到执行完队列里【所有的】微任务
- 如果在执行microtask的过程中,又产生了microtask,那么会加入到队列的末尾,也会在这个周期被调用执行
- 从宏任务队列取出队首的任务,放入调用栈执行
- 宏队列中只取出【一个】任务执行,执行完这一个之后就去执行微任务
- 重复2-5这四步
PS:在执行完所有的microtask之后,下一个macrotask之前,紧跟着执行UI render