js执行顺序一步步解析

15 篇文章 0 订阅

在这里插入图片描述

js是单线程的,但是浏览器是多线程的,多个线程相互配合以保持同步

    var set1=setTimeout(function () {
        console.log('s1')
        var p0=new Promise(function (resolve, reject) {
            resolve(789);
        }).then(function (res) {
            console.log(res)//123
        })
    })
    var p1 = new Promise(function (resolve) {
        console.log('promise1')
        resolve(2)
    });
    var set2=setTimeout(function () {
        console.log('s2')
    });

    p1.then(res => {
        console.log('then1')
    });

    console.log(2)

    var p2=new Promise(function (resolve, reject) {
        resolve(123);
    }).then(function (res) {
        console.log(res)//123
    })

    var p3=new Promise(function (resolve, reject) {
        reject(456);
    }).catch(function (res) {
        console.log(res)//456
    })

promise 是个微任务
setTimeout 是个宏任务

第一次执行
set1加入宏任务队列=>p1的console.log(‘promise1’)是同步,所以先输出’promise1’=>
set2加入宏任务队列=>p1.then加入微任务队列接着碰到console.log(2),所以输出2=>接着p2,p3加入微任务队列;

此时的的微任务队列:p1.then,p2.then,p3.catch
此时的的宏任务队列:set1,set2
第一次从上到下执行会输出(1)promise1,(2)2

第二次执行:主线任务执行好后,要先执行微任务队列,队列,顾名思义,先进先出,就像排队一样,此时将p1.then,p2.then,p3.catch全部执行
所以输出then1,123,456;此时的微任务队列已经执行好了,接着要执行宏任务队列
因为setTimeout时间都为0,所以先执行set1,遇到s1,是同步,直接执行,接着又碰到p0.then,放入微任务队列!!!这时已经回到主线程了;
此时的的微任务队列:p0.then
此时的的宏任务队列:set2
第二次从上到下执行会输出(1)s1

第三次执行:开始查询微任务队列,此时只有p0.then,执行,得到789,微任务队列执行完毕,开始查看宏任务队列,此时宏任务队列只剩下set2,所以输出s2
第三次从上到下执行会输出(1)789 (2)s2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值