js中的事件循环

文章详细解释了JavaScript中的同步和异步执行模式,重点介绍了事件循环的概念,包括宏任务队列(如setTimeout)和微任务队列(如Promise的then回调)的执行顺序。通过多个示例展示了在不同任务队列中的代码如何按照特定顺序执行,强调微任务总是在当前宏任务执行完毕后立即执行。
摘要由CSDN通过智能技术生成

了解js中的同步和异步:

同步:代码自上而下有顺序的先后执行,一行一行执行。

异步:很多时候看起来像是和同步代码一起执行,相对于同步的代码一般都会最后执行。

事件循环,先执行同步 再执行异步。

事件循环:先执行一个宏任务(宏任务队列中) 再清空微任务队列中所有微任务。浏览器中一直在重复这个事情,所以叫事件循环。

第一次执行js ,整体的代码 会被当做一个 宏任务-执行。

宏任务队列 :Macrotask Queue: ajax、setTimeout、setInterval、Dom监听等   

微任务队列: Microtask Queue: Promise的then回调、 Mutation Observer API、queueMicrotask

注意:每一次执行宏任务之前,都是要确保我微任务的队列是空的,也就是说从代码执行的顺序来说微任务优先于宏任务。

案例一:

        //异步: 
        //延时器和定时器都是异步 异步操作 异步任务 --宏任务
        console.log(1);//主线程
        setTimeout(() => {
            console.log(2);//宏任务队列
        }, 0)//交给浏览器  放到最后执行

        console.log(3);//主线程
        
        //微任务队列  异步任务队列 异步操作 异步任务
        queueMicrotask(function () { 
            console.log(4);//微任务队列
        })
        //1 3 4 2

案例二: 

        // 每一次执行宏任务之前,都是要确保我微任务的队列是空的,也就是说从代码执行的顺序来说微任务优先于宏任务。

        console.log(1);
        // 微任务队列(异步任务队列)--异步操作--异步任务
        queueMicrotask(function(){
            console.log(2);
        })
        // 延时器和定时器 都是异步操作--也叫异步任务--宏任务
        setTimeout(() => {
            console.log(3);
        }, 1000);

        queueMicrotask(function(){
            console.log(4);
        })
        console.log(5);
        //1 5 2 4 3

案例三: 

        console.log(1); //同步
        //Promise.then 是微任务
        new Promise(function(r) {
            //同步的代码
            console.log(2);
            r();
        }).then(function(){
            //异步的代码
            console.log(3);
        })
        console.log(4); //同步
        //1 2 4 3

案例四: 

        // 同步
        console.log(1);
        // console.log(2);
        // 微任务队列(异步任务队列)--异步操作--异步任务
        // 延时0ms的 异步操作
        queueMicrotask(function () {
            console.log(4);
        });
        // 
        // 延时器和定时器 都是异步操作--也叫异步任务--宏任务
        setTimeout(() => {
            console.log(2);
        });
        setTimeout(() => {
            console.log(6);
        });

        queueMicrotask(function () {
            console.log(5);
        });

        console.log(3);
        //1 3 4 5 2 6

案例五: 

        // 同步
        console.log(1);
        // console.log(2);
        // 微任务队列(异步任务队列)--异步操作--异步任务
        // 延时0ms的 异步操作
        queueMicrotask(function () {
            console.log(4);
        });
        // 
        // 延时器和定时器 都是异步操作--也叫异步任务--宏任务
        setTimeout(() => {
            console.log(2);

            queueMicrotask(function () {
                console.log(7);
            });

        });
        setTimeout(() => {
            console.log(6);
        });

        queueMicrotask(function () {
            console.log(5);
        });
        console.log(3);
        //1 3 4 5 2 7 6

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值