0
点赞
收藏
分享

微信扫一扫

前端面试题之代码输出(十)

书接之前代码输出题目,

前端面试题之代码输出

前端面试题之代码输出二

前端面试题之代码输出三

前端面试题之代码输出四

前端面试题之代码输出五

前端面试题之代码输出六

前端面试题之代码输出七

前端面试题之代码输出八

前端面试题之代码输出九


异步&事件循环
19.代码输出结果

async function async1() {
    console.log("async1 start");
    await async2();
    console.log("async1 end");
    setTimeout(() => {
        console.log('timer1')
    }, 0)
}
async function async2() {
    setTimeout(() => {
        console.log('timer2')
    }, 0)
    console.log("async2");
}
async1();
setTimeout(() => {
    console.log('timer3')
}, 0)
console.log("start")

输出结果如下:

async1 start
async2    
start     
async1 end
timer2    
timer3    
timer1

代码执行顺序如下:

  1. 首先进入 async1 ,打印 async1 start
  2. 之后遇到 async2 ,进入 async2 ,遇到定时器 timer2 ,加入宏任务队列,之后打 印 async2
  3. 由于 async2 阻塞了后面代码的执行,所以执行后面的定时器 timer3 ,将其加入宏任 务队列,之后打印 start
  4. 然后执行 async2 后面的代码,打印出 async1 end ,遇到定时器 timer1 ,将其加入宏任务队列
  5. 最后,宏任务队列有三个任务,先后顺序为 timer2timer1 timer3 ,没有微任务,所以直接所有的宏任务按照先进先出的原则执行
20.代码输出结果

async function async1() {
    console.log('async1 start');
    await new Promise(resolve => {
        console.log('promise1')
    })
    console.log('async1 success');
    return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')

输出结果如下:

srcipt start
async1 start
promise1
srcipt end

代码执行顺序如下:

这里需要注意的是在 async1 await 后面的 Promise 是没有返回值的,也就是它的状态始终是 pending 状态,所以在 await 之后的内容是不会执行的,包括 async1 后面的 .then


举报

相关推荐

0 条评论