宏任务和微任务笔记

258 阅读2分钟

宏任务和微任务

一.什么是宏任务和微任务

JavaScript把异步任务又做了进一步的划分,异步任务又分为两类,分别是:

  1. 宏任务(macrotask)
    • 异步ajax请求
    • setTimeout、setInterval
    • 文件操作
    • 其他宏任务
  2. 微任务(microtask)
    • promise.then、.catch和 .finally
    • process.nextTick
    • 其他微任务

image.png

二.宏任务和微任的执行顺序

image.png

​ 每一个宏任务执行之后,都会检查是否存在待执行的微任务,如果有,则执行完所有微任务之后,再继续执行下一个宏任务

三.银行业务场景解读宏任务和微任务

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);

分析:

  1. 先执行同步任务
  2. 同步任务执行完毕后检查是否有微任务
  3. 最后执行宏任务

答案: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