JS代码中的各个任务分类如下:
(序号.任务类别:执行机制)
- 同步任务:放入主线程直接执行
- 异步任务
- 微任务:放到微任务队列,等待主线程执行完步。
- 宏任务:放到宏任务队列,等待主线程执行完毕,执行并清空微任务队列后,执行。
!:首次执行微任务之前一定执行完了主线程的js代码,即第一个宏任务,所以应该说是在宏任务后执行所有微任务队列队列中的微任务。
宏任务:
1. 整体script代码
2. setImmediate、setTimeout、setInterval
3. new Promise().resolve()
4. DOM 事件回调
5. ajax请求结束后的回调
6. I/O
7. UI rendering。
微任务(优先级按从高到低):
1. process.nextTick
2. Promise.then()
3. MutationObserver(DOM事件监听)
宏任务队列 | 微任务队列 |
---|---|
setTimeout | promise.then |
new Promise.resolve() | preomise.then |
执行主线程时会将同步任务一次性完成(主线程的js代码就是第一个宏任务),然后清空微任务队列,然后取一个宏任务执行,然后如果又有了微任务,继续清空微任务队列。
例子:
console.log("同步任务-直接执行");
setTimeout(() => {
console.log("timeout-宏任务,放入了宏任务队列,在此执行之前一定清空了微任务队列");
}, 0)
new Promise((resolve, reject) => {
console.log("new Promise.resolve()-是同步任务-直接执行")
resolve()
}).then(() => {
console.log("then1-微任务,放入微任务队列,会在下一个宏任务执行前执行")
}).then(() => {
console.log("then2-微任务,放入为任务队列,会在上一个then1之后执行")
})
console.log("同步任务-直接执行")
// 输出
// 同步任务-直接执行
// new Promise.resolve()-是同步任务-直接执行
// 同步任务-直接执行
// then1-微任务,放入微任务队列,会在下一个宏任务执行前执行
// then2-微任务,放入为任务队列,会在上一个then1之后执行
// timeout-宏任务,放入了宏任务队列,在此执行之前一定清空了微任务队列