题目如下:
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