Javascript把任务分为宏任务和微任务。
ES5之后,Javascript引入了Promise,这样不需要浏览器Javascript本身也能发起异步任务了。
宏任务是由宿主环境(浏览器,Node发起),微任务是由Javascript自身发起的。
宏任务(浏览器,Node发起)
- script
- 事件
- 网络请求(Ajax,Fetch)
- setTimeout()单次 / setInterval()循环 定时器
微任务(Javascript引擎发起)
- Promise
注意:Promse是同步执行的,then catch回调函数是异步。
执行过程
1.同步代码(js执行栈,回调栈)
2.微任务的异步代码
- process.nextTick() Node
- Promise.then() catch()
- Async/Await
- Object.observe等
3.宏任务的异步代码
- script代码块
- setTimeout() / setInterval()
总结
1.先执行同步代码
2.然后执行异步代码里面的微任务队列
3.微任务队列执行顺序是先进入任务队列的会被先推到主线程先执行,后进入队列的后执行
4.这里要注意Promse是同步执行的,then catch回调函数才是异步任务里面的微任务
5.微任务里面的任务队列按照先进先出原则全部执行完后
6.最后再去检查宏任务队列,也是按照先进先出原则,执行宏任务里面的异步代码