JS事件循环例题

new Promise((resolve, reject) => {
    console.log('promise1')
    resolve()
}).then(() => {
    console.log('promise2')
})

console.log('start1')

setTimeout(() => {
    console.log('a')
},2000)

setTimeout(() => {
    console.log('b')
},1000)

setTimeout(() => {
    Promise.resolve().then(() => {
        console.log('promiseA')
    }).then(() => {
        console.log('promiseB')
    })
})

Promise.resolve().then(() => {
    console.log('promise88')
    setTimeout(() => {
        console.log(333)
    })
}).then(() => {
    console.log('promise2')
    setTimeout(() => {
        console.log(555)
    })
})

console.log('start2')

解析:

  • 首先javascrip全局上下文入栈,遇到new Promise()同步任务执行打印promise1 resolve()后 .then异步函数被推入微任务队列
  • 遇到console.log('start1')同步立即执行打印start1
  • 遇到setTimeout 异步任务2s后把要执行的任务推入宏任务队列中
  • 遇到setTimeout 异步任务1s后把要执行的任务推入宏任务队列中
  • 遇到setTimeout 异步任务立即把要执行的任务推入宏任务队列中
  • 遇到Promise执行resolve后将第一个then方法推入微任务队列中
  • 遇到console.log('start2')执行打印start2
  • 此时打印了 promise1、start1、start2
  • 执行完当前主线程后依次执行当前微任务队列、直至清空、队列的结构是先进先出、所以依次如下
  • 执行第一个微任务打印promise2
  • 执行第二个微任务打印promise88。紧接着遇到setTimeout 异步任务立即把要执行的任务推入宏任务队列中、将后面的then推入微任务队列中
  • 执行第三个微任务打印promise2。紧接着遇到setTimeout 异步任务立即把要执行的任务推入宏任务队列中
  • 检查当前微任务队列是否为空、为空将宏任务队列中的下一个入栈执行
  • 遇到promsie.resolve()执行将then方法推入微任务队列
  • 清空当前微任务队列打印promiseA 将后面的then又推入微任务队列
  • 清空当前微任务队列打印promiseB
  • 判断当前微任务队列是否为空、为空将下一个宏任务入栈并执行
  • 打印333
  • 打印555
  • 打印a
  • 打印b
  • 全局上下文出栈,代码执行完毕。

最终结果为:

  • promise1
  • start1
  • start2
  • promise2
  • promise88
  • promise2
  • promiseA
  • promiseB
  • 333
  • 555
  • b
  • a

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值