• JS的执行顺序 setTimeout与Promise async/await


    今天碰到一个很经典js执行顺序的题 代码不是很长
    问的是console.log的输出顺序
    这道题涉及到的知识点还挺多的
    async function async1() {
        console.log("async1start");
        await async2();
        console.log("async1end");
    }
    //函数2
    async function async2() {
        console.log('async2')
    }
    console.log("scriptstart");
    setTimeout(function () {
        console.log("settimeout");
    }, 0)
    
    async1()
    new Promise(function (resolve) {
        console.log("promise1");
        resolve();
    }).then(function () {
        console.log("promise2");
    });
    console.log('script end');
      
      //执行结果
       scriptstart
       async1start
       async2
       promise1
       script end
       async1end
       promise2
       settimeout
    
    js 单线程的 它会先执行一些同步操作 所以先输出的就是scriptstart
    然后是async1start async声明的函数虽然执行异步 但是他也是属于同步的写法
    和async同时出现的await 会强迫其他代码等待自己执行完之后再执行 所以第三个输出async2
    然后再继续 输出 promise1和script end
    async1end最后一个同步代码输出完毕
    剩下的就是promise的.then里边的异步 和 settimeout 这里涉及到异步的宏任务和微任务 settimeout 属于宏任务,promise属于微任务
    主线程执行完了之后先从微任务栈里面获取微任务执行,没有微任务了,就去宏任务栈里面获取宏任务执行,所以在一个循环内,微任务是比宏任务先执行的
    所以setTimeout在最后被执行
  • 相关阅读:
    Apache Beam的特点
    Apache Beam是什么?
    Kudu1.1.0 、 Kudu1.2.0 Kudu1.3.0的版本信息异同比较
    Kudu compaction design
    [转]Oracle trunc()函数的用法
    [转]Charts (Report Builder and SSRS)
    [转]表变量和临时表的比较
    [转]MONTHS_BETWEEN Function
    [转]Grunt 新手一日入门
    [转]Format a ui-grid grid column as currency
  • 原文地址:https://www.cnblogs.com/mxnl/p/13507057.html
Copyright © 2020-2023  润新知