14
2019
06

一道有趣的前端面试题

题目如下:

async function async1() {

console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2')
}
console.log('script start')
setTimeout(function () {
console.log('setTimeout')
}, 0)
async1();
new Promise(function (resolve) {
console.log('promise1')
resolve();
}).then(function () {
console.log('promise2');
})

console.log('script end');


控制台打印结果如下:

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

个人理解如下:

script start先执行没毛病

script start执行完毕后遇到了setTimeout, setTimeout会被放到队列的末尾,所以最后打印setTimeout

执行为setTimeout之后执行async1 ,这是一个异步函数,async1 start先被打印了出来,然后遇到了await关键字,await后面是一个promise对象,要等await执行完有结果之后再继续向下 ,所以接着打印async2

接着是一个promise对象,promise对象一创建就会执行,所以promise1被打印出来,then里面的代码要等同步代码执行完后才执行,所以先打印script end再打印promise2

但为什么async1 end会在promise2之前被打印出来呢,个人猜想是因为async1是异步函数,不阻塞下边代码的运行,async1 end先被加到了队列里,然后promise2被加到了队列里,然后从队里取出的时候就先打印async1再打印promise2

« 上一篇 下一篇 »

公告:

跟着我一起每天进步一点点,让学习成为一种习惯!

公告:

跟着我一起每天进步一点点,让学习成为一种习惯!