zoukankan      html  css  js  c++  java
  • js 队列和事件循环

    1.示例代码

    <!DOCTYPE html>
    <html lang="zh">
    
        <head>
            <meta charset="UTF-8" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />
            <meta http-equiv="X-UA-Compatible" content="ie=edge" />
            <title>js队列</title>
        </head>
    
        <body>
            <script type="text/javascript">
                
                setTimeout(function() {
                    console.log('timeout1')
                },0)
                setTimeout(function() {
                    console.log('timeout2')
                },10)
                new Promise(function(resolve) {
                    console.log('promise1')
                    for(var i = 0; i < 1000; i++) {
                        i == 99 && resolve()
                    }
                    console.log('promise2')
                }).then(function() {
                    console.log('then1')
                }).then(function(){
                    console.log('then2')
                })
                console.log('global1')
            </script>
        </body>
    
    </html>

     

    控制台输出:

    2、队列

    setTimeout、setInterval和事件绑定中的代码,通过队列来执行。不是函数调用栈。

    任务队列分为:宏任务(macro-task)和微任务(micro-task)。

    macro-task:script(整体代码)、setTimeout、setInterval、I/O

    micro-task:Primise

     3、执行顺序

    (1)宏任务的script

    (2)执行micro-task,执行完后 第一次事件循环结束

    (3)在执行宏任务中的其他任务,如setTimeout。在执行在其他任务如setTimeout可能产生的微任务。微任务执行完毕后再执行其他宏任务队列中的任务。直到宏任务队列中的任务都被执行一遍,并且清空了微任务,第二次循环结束。

    (4)如果第二次循环中产生了新的宏任务,或者之前的宏任务没有满足执行条件(如有延迟时间或等待事件触发),那么会继续以同样的顺序重复循环。

  • 相关阅读:
    ubuntu 升级到5.1kernel,打开bbr
    python json.loads json.dumps的区别
    centos7 install vim8
    Linux的Network Tunnel技术
    Linux内核网络数据包处理流程
    CAD2010 破解方法
    [原创]MSP430FR4133练习(一):GPIO输入电平状态判断
    [原创] Xinput_1.3.DLL / MSVCR100.DLL文件缺失解决办法
    [原创]找不到mswinsck.ocx的解决办法
    Windows7系统推荐
  • 原文地址:https://www.cnblogs.com/mengfangui/p/9361910.html
Copyright © 2011-2022 走看看