最近遇到一道题如下,求输出结果

感觉还是蛮有意思的,找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了?)的更多相关文章

  1. 原生js 异步请求,responseXML解析

    异步更新原理:用XMLHTTP发送请求得到服务器端应答数据,在不重新载入整个页面的情况下,用js操作Dom最终更新页面1.创建XMLHttp请求协议 function createXMLHttpReq ...

  2. JS魔法堂:深究JS异步编程模型

    前言  上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...

  3. 深究JS异步编程模型

    前言  上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...

  4. JS异步加载的三种方式

    js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载,. 默认正常 ...

  5. js异步加载 defer和async 比较

    网上说法很多,很少一句话能总结清楚的,终于找到两句一针见血的描述,很到位: 相同点:都不阻塞DOM解析 defer  :顺序:保证先后顺序.解析:HTML 解析器遇到它们时,不阻塞(脚本将被异步下载) ...

  6. Node.js异步处理CPU密集型任务

    Node.js异步处理CPU密集型任务 Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景.然而数据密集型实时应用程序并非仅仅有I/O密集型任务,当碰到 ...

  7. 转:web前端面试题合集 (Javascript相关)(js异步加载详解)

    1. HTTP协议的状态消息都有哪些? 1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请 ...

  8. JS异步加载的三种方案

    js加载的缺点:加载工具方法没必要阻塞文档,个别js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载. 一.def ...

  9. js异步梳理:1.从浏览器的多进程到JS的单线程,理解JS运行机制

    大家很早就知道JS是一门单线程的语言.但是也时不时的会看到进程这个词.首先简单区分下线程和进程的概念 1. 简单理解进程 - 进程是一个工厂,工厂有它的独立资源 - 工厂之间相互独立 - 线程是工厂中 ...

  10. JS异步编程 (1)

    JS异步编程 (1) 1.1 什么叫异步 异步(async)是相对于同步(sync)而言的,很好理解. 同步就是一件事一件事的执行.只有前一个任务执行完毕,才能执行后一个任务.而异步比如: setTi ...

随机推荐

  1. C 语言编程 — 指令行参数

    目录 文章目录 目录 前文列表 命令行参数 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...

  2. apisix~升级原始插件的方法

    扩展apisix原始插件 当apisix提供的插件不能满足我们要求时,我们可能需要将它的plugin进行个性化扩展,例如一个jwt认证插件jwt-auth,它本身具有验证jwt有效性功能,支持rs25 ...

  3. pageoffice6实现Word在线套打

    使用Word可以套打,其实套打一般就是将要打印的内容分毫不差的打印到已有的模板中去,比如奖状.证书.票据.报表等都可以使用套打完成. 方法一: 将Word页面排版的和打印纸中的页面完全相同,然后将打印 ...

  4. Java静态变量在静态方法内部无法改变值

    一.如何解决"Java静态变量在静态方法内部无法改变值"的问题 在Java中,静态变量(也称为类变量)属于类本身,而不是类的任何特定实例.它们可以在没有创建类的实例的情况下访问和修 ...

  5. Java 创建/识别条形码

    项目刚好需要用到就记录一下 -- 依赖 <!-- 条形码生成 --><dependency> <groupId>net.sf.barcode4j</group ...

  6. 开源项目 cloud-platform 的本地部署

    F7 单步调试,进入函数内部 F8 单步调试,不进入函数内部 F9 继续执行,进入下一个断点或执行完程序 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Ctrl+F8 设置/取消当前 ...

  7. 【C#】初次使用webapi的体会

    webapi controller 要继承 ApiController   重写权限验证 ,记得使用 System.Web.Http下的AuthorizeAttribute.   webapi默认路由 ...

  8. tab切换中嵌套swiper轮播

    今天在做官网的时候需要用到swiper多图轮播的功能,但是得嵌套在tab切换中,就在我把砖都搬完后,发现了个问题,就是我在进行tab切换后,发现原本设置的swiper的自动轮播竟然失效了,而且样式也是 ...

  9. c语言不可不说的一件事——进制之间的转化

    进制之间的转换 二进制转换 二进制转换为十进制 10111010.101 转换方法: 个位数是乘以2的0次方 从小数点开始分割,(小数点前从右往左,小数点后从左往右)乘以2的对应次方(从0开始取),最 ...

  10. C#.NET 使用HttpWebRequest发送JSON

    方法: public static string HttpPostJson(string url, string postStr, int timeOut, string charset) { Htt ...