js 异步 任务 题目解析(chatgpt bug了?)

最近遇到一道题如下,求输出结果
感觉还是蛮有意思的,找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任务队列就一个,不存在微任务队列,宏任务完成就会检查队列中微任务执行完毕,然后执行微任务,是否是这样滴
2 不同浏览器版本是否输出不同?不同node版本是否输出不同?

其他

1 await会把后面的代码包装,当前语句的代码执行完成后推到微任务
2 js nodejs 时间循环机制不太一样

posted @   彩虹刀法  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示