同步异步
首先,我们要先了解下 Js 。js 是一种单线程语言,简单的说就是:只有一条通道,那么在任务多的情况下,就会出现拥挤的情况,这种情况下就产生了 ‘多线程’ ,但是这种“多线程”是通过单线程模仿的,也就是假的。那么就产生了同步任务和异步任务。
- 同步任务:同步任务不需要进行等待,必须立即看到执行结果,比如console log
- 异步任务:异步任务需要等待一定的时候才能看到结果,比如setTimeout、网络请求
微任务和宏任务
宏任务和微任务都是异步任务.最开始的时候只有宏任务,但是后来程序猿发现异步任务全部排队一个一个执行也不太好,因为就算是异步任务里面也有一些代码更重要需要先执行,就是说它要插队.这个时候就有了微任务.
然后代码执行顺序发生改变
- 先执行同步代码
- 遇到宏任务,放入队列
- 遇到微任务,放入微任务队列
- 执行栈为空
- - 将微任务入栈执行
- 所有的微任务完成之后,取出宏任务队列来执行
只要有微任务就先执行微任务
下面列举常用的的宏任务和微任务。
任务(代码) | 宏/微 任务 | 环境 |
---|---|---|
script | 宏任务 | 浏览器 |
事件 | 宏任务 | 浏览器 |
网络请求(Ajax) | 宏任务 | 浏览器 |
setTimeout() 定时器 | 宏任务 | 浏览器 / Node |
fs.readFile() 读取文件 | 宏任务 | Node |
Promise.then() | 微任务 | 浏览器 / Node |