JS事件循环(Event Loop)宏任务微任务

1 代码

首先,直接上代码(我的作业):

                setTimeout(() => {
                    console.log(1);
                }, 100)
                
                setTimeout(() => {
                    console.log(2);
                })

                
                new Promise((resolve) => {
                    console.log(3)
                    resolve();
                }).then(() => {
                    console.log(4);
                })

                new Promise((resolve) => {
                    console.log(5);
                })

                async function asyn1() {
                    console.log(6);
                }

                asyn1().then(() => {
                    console.log(7);
                })

                console.log(8);

直接说一下运行结果:

 3 5 6 8 4 7 2 1 

2 为什么会这样

    从我的理解来看,这是由于JS中的事件循环机制(Event Loop)决定的,JS中的事件循环将任务队列分为宏任务(Tasks)和微任务(Microtasks)。任务队列的调度机制和我们想的不一样,因此结果页不一样。

2.1 什么任务属于宏任务/微任务

宏任务队列包含任务:

    script(主程序代码),setTimeout,setInterval,setImmediate,I/O,UI rendering

微任务队列包含任务:
    process.nextTick,Promises,Object.observe,MutationObserver

2.2 揭晓流程

                // 打印次序: 3 5 6 8 4 7 2 1 
                // log(1) 延迟至宏任务队列,延迟0.1s执行
                // log(2) 延迟至宏任务队列,不延迟
                // log(3) 直接打印,then中的log(4)到微任务队列
                // log(5) new Promise()直接打印;
                // log(6) 异步方法(相当于一个隐式的Promise),打印
                // log(7) then 到微任务队列
                // log(8) 直接打印
                // 至此,一次事件循环结束,轮询微任务队列,再轮询宏任务队列
                // 微任务队列,log(4),log(7)
                // 下一轮的宏任务:log(2),log(1)

3 小结

    这是第一次对JS的事件处理进行分析,有什么错误还请包涵和指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值