您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页每日一题(五)async function async1() {console.log('async1 start');await async2();console.log('async1 end')

每日一题(五)async function async1() {console.log('async1 start');await async2();console.log('async1 end')

来源:保捱科技网

题目描述:写出执行结果,并解释原因(以chrome为准)

async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}

async function async2() {
    console.log('async2');
}

console.log('script start');

setTimeout(()=>{
    console.log('setTimeout');
},0)

async1();

new Promise((resolve)=>{
    console.log('promise1');
    resolve();
}).then(()=>{
    console.log('promise2');
});

console.log('script end');

答案:

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

知识点:

  • 考察的是事件循环和回调队列。注意以下几点:
  • Promise 优先于 setTimeout 宏任务,所以 setTimeout 回调会最后执行
  • Promise 一旦被定义就会立即执行
  • Promise 的 resolve 和 reject  是异步执行的回调。所以 resolve() 会被放到回调队列中,在主函数执行完和 setTimeout 之前调用
  • await 执行完后,会让出线程。async 标记的函数会返回一个 Promise 对象

解析:

  • 首先,事件循环从宏任务(macrostack)队列开始,这个时候,宏任务队列中,只有一个 script (整体代码)任务。从宏任务队列中取出一个任务来执行。
  • 首先执行 console.log('script start'),输出 ‘script start'
  • 遇到 setTimeout 把 console.log('setTimeout') 放到 macrotask 队列中
  • 执行 aync1() 输出 ‘async1 start' 和 'async2' ,把 console.log('async1 end') 放到 micro 队列中
  • 执行到 promise ,输出 'promise1' ,把 console.log('promise2') 放到  micro 队列中
  • 执行 console.log('script end'),输出 ‘script end'
  • macrotask 执行完成会执行 microtask ,把 microtask quene 里面的 microtask 全部拿出来一次性执行完,所以会输出 'async1 end' 和 ‘promise2'
  • 开始新一轮的事件循环,去除执行一个 macrotask 执行,所以会输出 ‘setTimeout'

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务