上篇文章介绍了js任务可以分为同步任务和异步任务。而js异步任务又可以分为宏任务和微任务。
在ES5之后,js引入了 Promise ,这样不需要浏览器,js 引擎自身也能够发起异步任务。
- 宏任务是由宿主环境(浏览器、Node)发起的。
- 微任务是由 js 引擎发起的任务。Promise 本身同步,then/catch的回调函数是异步的
可以把代码分为三类
同步代码(js执行栈/回调栈)
微任务的异步代码(js引擎)
- process.nextTick(node)
- Promise.then() catch() Promise本身同步,then/catch的回调函数是异步的微任务
- Async/Await
- Object.observe 等等
宏任务的异步代码(宿主环境)
- script (代码块)
- setTimeout / setInterval 定时器
- setImmediate 定时器
- I/O
- UI render
执行过程顺序
先执行同步代码,接着事件循环微任务队列,执行微任务的异步代码,再事件循环宏任务队列,执行宏任务的异步代码。