宏任务和微任务
一.什么是宏任务和微任务
JavaScript把异步任务又做了进一步的划分,异步任务又分为两类,分别是:
- 宏任务(macrotask)
- 异步ajax请求
- setTimeout、setInterval
- 文件操作
- 其他宏任务
- 微任务(microtask)
- promise.then、.catch和 .finally
- process.nextTick
- 其他微任务
二.宏任务和微任的执行顺序
每一个宏任务执行之后,都会检查是否存在待执行的微任务,如果有,则执行完所有微任务之后,再继续执行下一个宏任务
三.银行业务场景解读宏任务和微任务
1.小云和小腾去银行办业务,首先,在取号之后进行排队
- 宏任务队列
2.假设当前银行只有一名柜员,小云先办理存款业务,小腾只能等待
- 单线程,宏任务按次序执行
3.小云办完存款业务后,柜员询问他有没有想办的其他业务
- 宏任务执行完毕后,检查是否还有微任务
4.小云告诉柜员,想买理财产品,然后在办理一张信用卡
- 执行微任务,后面的宏任务被推迟
5.小云离开柜台后,柜员才开始为小腾办理业务
- 所有微任务执行完毕,开始执行下一个宏任务
四.题目:分析执行顺序
// 宏任务
setTimeout(function () {
console.log('1');
})
// 同步任务
new Promise(function (resolve) { //new promise 就会立即执行function里的代码 so是同步任务
console.log('2');
resolve()
// 微任务
}).then(function () {
console.log('3');
})
// 同步任务
console.log(4);
分析:
- 先执行同步任务
- 同步任务执行完毕后检查是否有微任务
- 最后执行宏任务
答案:2431
五.经典面试题(分析顺序)
// 同步任务
console.log('1');
// 宏任务
setTimeout(function() {
console.log('2');
// 同步任务
new Promise(function(resolve) {
console.log('3');
resolve()
// 微任务
}).then(function(){
console.log('4');
})
})
// 同步任务
new Promise(function(resolve){
console.log('5');
resolve()
// 微任务
}).then(function(){
console.log('6');
})
setTimeout(function(){
console.log('7');
new Promise(function(resolve){
console.log('8');
resolve()
}).then(function(){
console.log('9');
})
})
// 156234789