宏任务与微任务

本文详细阐述了JavaScript中的事件循环机制,特别是宏任务(如setTimeout、setInterval、ajax、DOM事件)和微任务(如Promise、async/await)的执行顺序。通过三个实例分析了任务队列中微任务先于宏任务执行的规则,展示了异步代码的执行流程。
摘要由CSDN通过智能技术生成

描述

  • 宏任务包括:setTimeout、setInterval、ajax、DOM 事件
  • 微任务包括:promise、async+await
  • 在 js 事件循环中,异步事件任务队列,先执行微任务(Jobs),再执行宏任务(Task)

实例1

console.log('1');
let timmer1 = setTimeout(()=>{
    console.log('2');
}, 0);
let func1 = new Promise((resolve, reject)=>{
    console.log('3');
    resolve();
}).then(()=>{
    console.log('4');
});
console.log('5');
// 1 3 5 4 2
  • 实例1的流程如下
  1. 开始
  2. 主线程,打印 1
  3. 将 timmer1 放入任务队列 A
  4. 主线程,func1 本身为同步事件,打印 3
  5. func1.then 为异步事件,将事件放入任务队列 A
  6. 主线程,打印 5
  7. 当前主线程结束,开始读取任务队列 A
  8. 当前任务队列 A:timmer1、func1.then
  9. 按照顺序,先执行微任务,再执行宏任务
  10. 执行 func1.then,打印 4
  11. 当前任务队列 A:timmer1
  12. 当前任务队列,微任务已经全部执行完毕,开始执行宏任务
  13. 执行 timmer1,打印 2
  14. 结束

实例2

let timmer1 = setTimeout(()=>{
    console.log('1');
    let timmer2 = setTimeout(()=>{
        console.log('2');
    }, 0);
    let func1 = new Promise((resolve, reject)=>{
        resolve();
        console.log('3');
    }).then(()=>{
        console.log('4');
    });
},0);
let timmer3 = setTimeout(()=>{
    console.log('5');
});
console.log('6');
// 6 1 3 4 5 2
  • 实例2的流程如下
  1. 开始
  2. 主线程,打印 6
  3. 将 timmer1 放入任务队列 A
  4. 将 timmer3 放入任务队列 A
  5. 当前主线程结束,开始读取任务队列 A
  6. 当前任务队列 A:timmer1、timmer3
  7. 按照顺序,先执行微任务,再执行宏任务
  8. 当前队列没有微任务,开始按顺序执行宏任务
  9. 执行 timmer1,打印 1
  10. 将 timmer2 放入任务队列 A
  11. 执行 func1,打印 3
  12. 将 func1.then 放入任务队列 A
  13. 当前任务队列 A:timmer3、timmer2、func1.then
  14. 按照顺序,先执行微任务,再执行宏任务
  15. 执行 func1.then,打印 4
  16. 当前任务队列,微任务已经全部执行完毕,开始按顺序执行宏任务
  17. 执行 timmer3,打印 5
  18. 执行 timmer2,打印 2
  19. 结束

实例3

async function func1(){
    console.log('1');
    await func2(); // await 后面的内容,相当于 promise.then 
    console.log('2');
}
function func2(){
    console.log('3');
};
func1();
console.log('4');
let func3 = new Promise((resolve, reject)=>{
    console.log('5');
    resolve();
}).then(()=>{
    console.log('6');
});
// 1 3 4 5 2 6
  • 实例3的流程如下
  1. 开始
  2. 主线程,执行 func1,打印 1
  3. 执行 func2,打印 3
  4. 将 await 所在作用域内,后面的所有内容放入任务队列 A
  5. 主线程,打印 4
  6. 主线程,执行 func3,打印 5
  7. 将 func3.then 放入任务队列 A
  8. 当前主线程已执行完毕,开始读取任务队列 A
  9. 当前任务队列 A:await、func3.then
  10. 按照顺序,先执行微任务,再执行宏任务
  11. 执行 await 作用域内后边的事件,打印 2
  12. 执行 func3.then,打印 6
  13. 结束
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值