zoukankan      html  css  js  c++  java
  • JavaScript js代码的执行顺序

    原文:https://juejin.cn/post/6844903512845860872

    我的简单理解:

    两个队列:一个宏任务队列,一个微任务队列

    一个事件循环

    宏任务包括:包括整体代码script,setTimeout,setInterval, I/O

    微任务包括:Promise的then\catch\finally方法

    执行步骤:

    最初是整个执行代码作为一个宏任务开始执行

    遇到普通脚本直接执行

    遇到Promise(function(resolve, reject){xxx}).then(function(result){yyy}, function(error){zzz}) 这种Promise代码,

      则会直接执行第1个function代码xxx,

      如果xxx代码中调用了resoleve或者reject回调,则会把对应的第2个或者第3个function加入到微任务队列

    遇到setTimeout(function(){xxx}, n),setInterval(function(){yyy}, n) 这种定时代码,则会在n秒后或者每n秒把对应的function加入到宏任务队列

    当前执行的那个宏任务结束后,从微任务队列取出一个微任务执行,循环直到当前微任务队列为空

    然后从宏任务队列中取出一个宏任务执行,重复上面的步骤

    直到所有任务执行完成

    console.log('1');
    
    setTimeout(function() {
        console.log('2');
        promise.then(function(re) {
            for (let i = 0; i < 1000000000; i++) {
                
            }
            console.log('3-' + re)
        })
        new Promise(function(resolve) {
            console.log('4');
            resolve();
        }).then(function() {
            console.log('5')
        })
    }, 2000)
    
    promise = new Promise(function(resolve) {
        console.log('7');
        resolve('8');
        console.log('pre 8');
    })
    console.log('pre 8 2');
    promise.then(function(re) {
        console.log('1-' + re);
        promise.then(function(re) {
            console.log('1-1-' + re)
        });
    });
    console.log('hh');
    promise.then(function(re) {
        console.log('2-' + re)
        promise.then(function(re) {
            console.log('2-1-' + re)
        });
    });
    
    setTimeout(function() {
        console.log('9');
        new Promise(function(resolve) {
            console.log('11');
            resolve();
        }).then(function() {
            console.log('12')
        })
    }, 2000)

    其他文章:

    深入理解 JavaScript 事件循环,宏任务与微任务

    JavaScript:彻底理解同步、异步和事件循环(Event Loop) 

  • 相关阅读:
    memwatch使用简化
    memwatch检测内存泄露
    mtrace检测内存泄露
    2.14 环境变量及参数
    设计模式[索引]
    二叉树遍历
    AppCan 双击返回按钮退出应用
    MySQL语句相关经验总结
    mysql连接失败或出现“Too many connections”错误
    让IE的Button自适应文字宽度兼容
  • 原文地址:https://www.cnblogs.com/yarightok/p/15632710.html
Copyright © 2011-2022 走看看