JS 是门非阻塞 单线程语言
JS 在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。
如果遇到异步的代码,会被挂起并加入到 任务Task队列中。
一旦执行栈为空,Event Loop 就会从 Task 队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说 JS 中的异步还是同步行为。
微任务包括 process.nextTick ,promise ,Object.observe ,MutationObserver 宏任务包括 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering
正确的一次 Event loop
所以正确的一次 Event loop 顺序是这样的
执行同步代码,这属于宏任务
执行栈为空,查询是否有微任务需要执行
执行所有微任务
必要的话渲染 UI
宏任务 -> 微任务 -> 宏任务
然后开始下一轮 Event loop,执行宏任务中的异步代码