最近遇到一道题如下,求输出结果
感觉还是蛮有意思的,找chatgpt做了一下
我是题
async function async1(){
console.log('1');
await async2();
console.log('2');
}
async function async2(){
console.log('3');
}
console.log('4')
setTimeout(function(){
console.log('5')
}, 0);
async1();
new Promise(function(resolve){
console.log('6');
resolve();
}).then(function(){
console.log('7')
});
console.log('8')
结果
4 1 3 6 8 2 7 5
解析如下
首先,执行同步代码console.log('4'),输出4。
然后,调用async1()函数,执行异步函数async1()。输出1,并且遇到await async2()语句,执行异步函数async2()。
接着,执行异步函数async2(),输出3。
回到async1()函数,继续执行,输出2。
然后,执行console.log('6')输出6。
继续执行同步代码console.log('8'),输出8。
然后,执行Promise构造函数,输出7。
最后,执行setTimeout中的回调函数,输出5。
但是这就有点尴尬了自己的解释和结果并不符合
我的理解是
首先,执行同步代码console.log('4'),输出4。
然后,调用async1()函数,执行异步函数async1()。输出1,并且遇到await async2()语句,执行异步函数async2()。
接着,执行异步函数async2(),输出3。
回到async1()函数,不继续执行,把所有代码块(命名为A)推到微任务队列里面去,等待执行
。
然后,执行console.log('6')输出6。
继续执行同步代码console.log('8'),输出8。
当前任务块代码执行完毕,开始执行微任务A 输出2
然后,执行Promise构造函数,输出7。
最后,执行setTimeout中的回调函数,输出5。
疑问
1 我曾经看书,忘了哪一个,js任务队列就一个,不存在微任务队列,宏任务完成红,会检查队列中微任务执行完毕,是否是这样滴
其他
1 await会把后面的代码包装,当前语句的代码执行完成后推到微任务
2 js nodejs 时间循环机制不太一样