在前端中,宏任务和微任务是异步任务的两种不同类型。
前端有很多中异步任务类型。
可以分为三类:
- 宏任务
- 定时器任务
- 用户交互事件任务(鼠标事件、键盘事件)
- 网络请求任务
- I/O操作任务(读写文件)
- 微任务
- Promise的回调函数
- MutationObserver的回调函数(用于监听 DOM 的变动,并在变动发生时执行相应的微任务。)
- 特殊任务
- requestAnimationFrame 用于在下一次浏览器重绘之前执行的任务。它通常用于实现流畅的动画效果。(一般将它认定为宏任务,少数资料将其归类为微任务)
- setImmediate 在 Node.js 环境中提供的宏任务,用于在当前事件循环的末尾立即执行任务。
- 延迟执行的脚本(<script defer>)在文档解析完成后,按照它们在文档中的顺序延迟执行的脚本。
在一般情况下可以吧异步任务分为这三种,但是在不同环境中也会有不同的判定差异。
宏任务有以下几个特点:
- 宏任务是由浏览器提哦你给的异步任务
- 宏任务是会放入宏任务队列中,按照一定的顺序去执行。
- 当任务队列为空后,事件循环机制会从宏任务队列中取出一个宏任务执行。
- 宏任务的执行是以完整的、不可中断的方式进行的,执行期间不会执行其他任务。
微任务由以下几个特点:
- 微任务是相对于宏任务而言的。
- 微任务会被放入微任务队列中,他的优先级高于宏任务。
- 当宏任务执行完毕后,事件循环机制会检查微任务队列,并按照顺序执行其中的微任务。
- 微任务的执行是连续的,知道任务队列清空才会继续执行下一个宏任务。
需要注意的是,微任务具有高优先级,并且可以在同一宏任务中添加多个微任务,它们会在当前宏任务执行完毕后立即执行。而宏任务的执行时机是在当前宏任务执行完毕后,从宏任务队列中取出下一个宏任务执行。
也就是说可以理解为一个宏任务包含了多个微任务。
在一个宏任务中,可能会产生多个微任务。这些微任务会被按照顺序添加到微任务队列中,等待宏任务执行完毕后依次执行。
一旦宏任务执行完成,事件循环会立即检查微任务队列,并按照添加的顺序执行其中的微任务,直到微任务队列为空。然后才会进入下一个宏任务的执行。