最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 浏览器事件循环机制(Event Loop)(下) - 掘金

    正文概述 掘金(Delicia_Lani)   2021-11-24   815

    这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

    接上一篇:juejin.cn/post/703286… 浏览器事件循环机制(Event Loop)(上)继续展开相关内容的描述。

    前言

    在事件循环机制(Event Loop)(上)中,主要介绍了相关概念,本篇将具体介绍事件循环机制的运行步骤及相关demo。

    事件循环机制

    • 执行一个宏任务(栈中没有就从事件队列中获取);
    • 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中;
    • 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行);
    • 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染;
    • 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)。

    下图非常详细地描述了事件处理过程: 浏览器事件循环机制(Event Loop)(下) - 掘金

    其实说白了就是首先会去执行一个宏任务,如果宏任务队列中没有宏任务呢?那就从事件队列中获取。不过在该宏任务执行过程中,如果遇到微任务了,不管遇到几个,都会将微任务放入到微任务队列当中,直到该宏任务执行完毕,会从队列中弹出;紧接着会去执行刚才加入到微任务队列当中的微任务;好啦,刚才那些微任务都执行完毕了,那就再去宏任务队列中看看还有没有宏任务,有的话继续执行任务队列中的第一个宏任务,没有的话就去看看微任务队列中有没有微任务。最后的最后,宏任务和微任务都执行完毕了,那就开始渲染了。

    Event Loop demo

    demo 1:

    console.log("我是开始");         //主程序代码(宏任务1)
     
    setTimeout(function() {         //产生了一个新的宏任务2——————放入宏任务队列
      console.log('setTimeout');
    }, 0);
     
    Promise.resolve().then(function() {    //产生了微任务1——————放入微任务队列
      console.log('promise1');
    }).then(function() {                   //产生了微任务2——————放入微任务队列
      console.log('promise2');
    });
     
    console.log('我是结束');        //主程序代码(宏任务1)
    

    上述代码打印顺序:我是开始 VM146:13 我是结束 VM146:8 promise1 VM146:10 promise2 VM146:4 setTimeout

    上述代码会先执行宏任务1,执行过程中遇到setTimeout这个宏任务,会将他放入到宏任务队列;又遇到了微任务1,2,将他们依次放入微任务队列中。执行完宏任务1后,会立即执行刚才执行过程中插入微任务队列的微任务,全部执行完刚才入队的微任务,然后去执行宏任务队列中的宏任务。 demo 2:

    async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }
    async function async2() {
        console.log('async2');
    }
     
    console.log('script start');
     
    setTimeout(function() {
        console.log('setTimeout');
    }, 0)
     
    async1();
     
    new Promise(function(resolve) {
        console.log('promise1');
        resolve();
    }).then(function() {
        console.log('promise2');
    });
    console.log('script end');
    */
    

    浏览器事件循环机制(Event Loop)(下) - 掘金

    注:

    1.async函数中在await之前的代码是立即执行的,所以会立即输出async1 start。 遇到了await时,会将await后面的表达式执行一遍,所以就紧接着输出async2,然后将await后面的代码也就是console.log('async1 end')加入到微任务队列中的Promise队列中,接着跳出async1函数来执行后面的代码。

    2.Promise中的函数是立即执行的,而后续的 .then 则会被分发到微任务队列的 Promise 队列中去。所以会先输出 promise1,然后执行 resolve,将 promise2 分配到对应队列。

    总结

    到目前为止,浏览器的事件循环机制就介绍完啦,希望我们都可以有所收获。

    Happy Ending.


    起源地下载网 » 浏览器事件循环机制(Event Loop)(下) - 掘金

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元