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 时间循环机制不太一样
js 异步 任务 题目解析(chatgpt bug了?)更多相关文章
JavaScript CSS Vue3 实现一个简单的Loading
配置和使用nvm免安装版本(nvm-noinstall.zip)
HarmonyOS:使用Node-API实现ArkTS与C/C++跨语言交互
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (一):项目简介及安装依赖
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (五):POST上传文件的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (六):token的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (七):MongoDB的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (三):Cors的设置及.env文件的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (二):项目文件夹架构及路由的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (八):API说明(暂时完结,后续考虑将在线版mongoDB变为本地版)
报error:0308010C:digital envelope routines::unsupported错--nodejs版本过高(nvm安装(更换)不同版本nodejs)
小结---安装nvm解决node版本不兼容的问题(node版本切换)