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

感觉还是蛮有意思的,找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. debug技巧之远程调试

    一.前言 大家好啊,我是summo,今天给大家分享一下我平时是怎么调试代码的,不是权威也不是教学,就是简单分享一下,如果大家还有更好的调试方式也可以多多交流哦. 当我们的应用发布到线上之后,就不能随意 ...

  2. Chart.js (v2.9.4)概要介绍

    chart.js是一个非常优秀的开源图表插件,扩展非常灵活,同时也提供了大量的钩子函数,给与用户添加自定义插件,实现个性化的需求. 具体的优势特点,这里不详述,网上大把资料,现开始正式深入了解这个插件 ...

  3. Istio(十):istio多集群部署模式

    目录 一.模块概览 二.多集群部署 2.1 多集群部署 2.2 网络部署模式 2.3 控制平面部署模型 2.4 网格部署模型 2.5 租户模式 2.6 最佳多集群部署 一.模块概览 在本模块中,我们将 ...

  4. Redis知识网络

    Redis知识网络 作者:运维君莫笑 链接:https://www.zhihu.com/question/470465324/answer/2006650219 Redis为什么这么快? 根据官方数据 ...

  5. Hangfire 使用笔记 任务可以分离到别的项目中,无需重复部署Hangfire,通过API方式通信。

    "巨人们"的地址 Hangfire Mysql: https://github.com/arnoldasgudas/Hangfire.MySqlStorage 在获取set表数据的 ...

  6. fabric compose文件解读(peer篇)

    peer是fabric中的基础单元,主要负责背书,验证交易合法性,保存区块链数据,查询数据.peer与orderer配合完成区块链的全部功能,orderer可以比作是管理员,peer属于是干货的员工, ...

  7. itest work(爱测试) 开源接口测试&敏捷测试管理平台 9.5.0 发布,接口测试及脑图用例升级

    (一)itest work 简介 itest work (爱测试)  一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...

  8. (性能测试)--记录一次高可用场景导致CPU资源升高

    测试场景:高可用场景--限流测试: 被测交易:查询类交易,HTTP协议: 交易链路:jmeter - web - coimpre(前置服务) -- coimbp -- cobp (coimbp .co ...

  9. SpringBoot系列(六)如何使用 MockMvc 或者 RestTemplate 发请求进行单元测试

    本文主要功能: 对最简单的/hello接口,如何编写单元测试用例. 1.首先,要引入以下依赖 <dependency> <groupId>org.springframework ...

  10. Easysearch压缩模式深度比较:ZSTD+source_reuse的优势分析

    引言 在使用 Easysearch 时,如何在存储和查询性能之间找到平衡是一个常见的挑战.Easysearch 具备多种压缩模式,各有千秋.本文将重点探讨一种特别的压缩模式:zstd + source ...