代码题: 看代码说结果, 事件循环 + async 函数的

1. 基本的 async/await 和事件循环

console.log('1');async function asyncFunc() {console.log('2');await Promise.resolve();console.log('3');
}asyncFunc();console.log('4');

执行顺序:

  1. 打印 1
  2. 定义异步函数 asyncFunc,但并不执行它。
  3. 调用 asyncFunc()
    • 打印 2
    • 遇到 await,所以 asyncFunc 的后续代码(打印 3)被移到事件队列中等待。
  4. 打印 4
  5. 所有同步代码执行完毕后,事件循环开始执行队列中的任务。
    • 打印 3

预期输出:

1
2
4
3

2. setTimeoutasync/await 的结合

console.log('1');setTimeout(() => {console.log('2');
}, 0);async function asyncFunc() {console.log('3');await Promise.resolve();console.log('4');
}asyncFunc();console.log('5');

执行顺序:

  1. 打印 1
  2. setTimeout 回调(打印 2)设置为在0毫秒后执行。但实际上,它会被放入宏任务队列,等待所有微任务完成。
  3. 定义异步函数 asyncFunc,但并不执行。
  4. 调用 asyncFunc()
    • 打印 3
    • 遇到 await,所以 asyncFunc 的后续代码(打印 4)被移到微任务队列中等待。
  5. 打印 5
  6. 执行微任务队列中的任务(因为微任务的优先级高于宏任务)。
    • 打印 4
  7. 执行宏任务队列中的任务。
    • 打印 2

预期输出:

1
3
5
4
2

3. 嵌套的 async/await

console.log('1');async function firstAsync() {console.log('2');await secondAsync();console.log('3');
}async function secondAsync() {console.log('4');await Promise.resolve();console.log('5');
}firstAsync();console.log('6');

执行顺序:

  1. 打印 1
  2. 定义两个异步函数,但不执行。
  3. 调用 firstAsync()
    • 打印 2
    • 调用 secondAsync()
      • 打印 4
      • 遇到 await,所以 secondAsync 的后续代码(打印 5)被移到微任务队列中等待。
    • firstAsync 的后续代码(打印 3)也被移到微任务队列中等待。
  4. 打印 6
  5. 执行微任务队列中的任务。
    • 打印 5
    • 打印 3

预期输出:

1
2
4
6
5
3

4. 多个异步函数

async function asyncOne() {console.log('1');await Promise.resolve();console.log('2');
}async function asyncTwo() {console.log('3');await Promise.resolve();console.log('4');
}console.log('5');asyncOne();
asyncTwo();console.log('6');

执行顺序:

  1. 定义两个异步函数,但不执行。
  2. 打印 5
  3. 调用 asyncOne()
    • 打印 1
    • 遇到 await,所以 asyncOne 的后续代码(打印 2)被移到微任务队列中等待。
  4. 调用 asyncTwo()
    • 打印 3
    • 遇到 await,所以 asyncTwo 的后续代码(打印 4)被移到微任务队列中等待。
  5. 打印 6
  6. 执行微任务队列中的任务。
    • 打印 2
    • 打印 4

预期输出:

5
1
3
6
2
4

5. Promise 的基本行为

console.log('1');Promise.resolve().then(() => {console.log('2');
});console.log('3');

执行顺序:

  1. 打印 1
  2. 创建一个已解决的Promise,并在微任务队列中注册一个回调。
  3. 打印 3
  4. 当同步代码执行完成后,事件循环开始处理微任务队列,执行回调。
  5. 打印 2

预期输出:

1
3
2

6. setTimeoutPromise 的组合

console.log('1');setTimeout(() => {console.log('2');
}, 0);Promise.resolve().then(() => {console.log('3');
}).then(() => {console.log('4');
});console.log('5');

执行顺序:

  1. 打印 1
  2. setTimeout的回调加入宏任务队列
  3. 创建一个已解决的Promise,并在微任务队列中注册第一个回调
  4. 在第一个then的回调中,注册第二个then的回调到微任务队列
  5. 打印 5
  6. 事件循环开始处理微任务,首先执行第一个then的回调
  7. 打印 3
  8. 紧接着,事件循环处理第二个then的回调
  9. 打印 4
  10. 最后,事件循环处理宏任务队列
  11. 打印 2

预期输出:

1
5
3
4
2

7. 多个 async/await 的嵌套

console.log('1');async function outerAsync() {console.log('2');await innerAsync();console.log('3');
}async function innerAsync() {console.log('4');await new Promise(resolve => setTimeout(resolve, 0));console.log('5');
}outerAsync();console.log('6');

执行顺序:

  1. 打印 1
  2. 定义两个异步函数,但此时并未执行它们
  3. 调用 outerAsync()
  4. 打印 2
  5. 调用 innerAsync()
  6. 打印 4
  7. 遇到setTimeout,所以它的回调被加入宏任务队列
  8. await将后续代码(打印 5outerAsync 中的打印 3)移至微任务队列
  9. 打印 6
  10. 事件循环开始处理微任务,但在此之前,必须先完成setTimeout的回调**,必须要等里面完成才能完成外面**
  11. 打印 5
  12. 继续执行outerAsync中的代码
  13. 打印 3

预期输出:

1
2
4
6
5
3

8. 多个微任务队列(这个不会)

console.log('1');async function firstFunc() {console.log('2');await Promise.resolve();console.log('3');
}async function secondFunc() {console.log('4');await Promise.resolve().then(() => {console.log('5');});console.log('6');
}firstFunc();
secondFunc();
console.log('7');

执行顺序:

  1. 打印 1
  2. 调用 firstFunc()
  3. 打印 2
  4. await使其后续代码(打印 3)移到微任务队列中
  5. 调用 secondFunc()
  6. 打印 4
  7. awaitthen使其后续代码(首先打印 5,然后打印 6)移到微任务队列中
  8. 打印 7
  9. 事件循环开始处理微任务队列
  10. 打印 5
  11. 打印 3
  12. 打印 6

预期输出:

1
2
4
7
5
3
6

9. 复杂的async/awaitsetTimeout

console.log('1');setTimeout(() => {console.log('2');
}, 0);async function asyncFunction() {console.log('3');await Promise.resolve();console.log('4');setTimeout(() => {

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的迭代器与生成器

文章目录 1、迭代器2、生成器3、列表推导式和生成器表达式4、enumerate() 在Python中,迭代器(Iterator)和生成器(Generator)是两种用于处理可迭代对象的重要工具。而可迭代对象包括列表,元组,字…

C#里Bitmap转Halocn的HObject

一般情况下,图像的width是4的倍数的话,用以下代码便可将彩色bitmap转出halcon里的HObject public void Bitmap2HObject(Bitmap bmp, out HObject image){try{Rectangle rect new Rectangle(0, 0, bmp.Width, bmp.Height);BitmapData srcBmpData bmp.L…

day-06 多进程服务器端 -- 进程间通信

一.多进程服务器端 (一)进程概念及应用 利用之前学习到的内容,我们的服务器可以按照顺序处理多个客户端的服务请求。在客户端和服务时间增长的情况下,服务器就不足以满足需求了。 1.两种类型的服务器端 (1&#xff…

记录--解决前端内存泄漏:问题概览与实用解决方案

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 内存泄漏是前端开发中的一个常见问题,可能导致项目变得缓慢、不稳定甚至崩溃。在本文中,我们将深入探讨在JavaScript、Vue和React项目中可能导致内存泄漏的情况,并提…

xml和json互转工具类

分享一个json与xml互转的工具类&#xff0c;非常好用 一、maven依赖 <!-->json 和 xm 互转</!--><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version></dependency&g…

使用kafka还在依赖Zookeeper,kraft模式了解下

Kafka的Kraft模式 概述 ​ Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器…

如何查看数据集下载后保存的绝对路径?

1.问题 当我们下载torchvision.datasets里面的数据集时&#xff0c;有时候会遇到找不到数据集保存路径的问题。 2.解决 引入os库 import os调用如下方法 os.path.abspath(数据集对象.root)以下面代码为例 import os import torchvision.datasets as datasets# 指定数据集…

vue3+tsx+element-plus中遇到的一些问题总结

前言&#xff1a; vue3tsxelement-plus中遇到的一些问题总结 1、手动打开/关闭 el-tooltip 1、定义ref const tooltipMoreRef ref(); 2、在标签上加ref <el-tooltip ref{tooltipMoreRef} content{t("chat.messageBox.more")} placement"top" effect&…

Java篇(输入输出和快捷键)

目录 定义 输入&#xff1a; 使用 Scanner类读入 循环读入数据 输出&#xff1a; 1.println() 2.println () 3.printf() 4.格式化输出 快捷输入 定义 1.输入&#xff08;Input&#xff09;输出&#xff08;Output&#xff09;—— IO 流 输入流&#xff1a;以电脑为…

Java连接websocket优雅断线、重连功能

为了实现优雅重连和重试&#xff0c;您需要在代码中添加一些逻辑来处理连接失败或断开连接的情况。 实现代码如下&#xff1a; import javax.websocket.*; import java.io.IOException;ClientEndpoint public class WebSocketClientEndpoint {private Session userSession n…

算法训练营第四十天(8.31)| 动态规划Part10:购买股票

目录 Leecode 309.买卖股票的最佳时机含冷冻期 Leecode 714.买卖股票的最佳时机含手续费 Leecode 309.买卖股票的最佳时机含冷冻期 题目地址&#xff1a;​​​​​​​力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目类型&#xff1a;股票问题 c…

设备报修系统有什么用?企业如何提高维修效率和质量?

在数字化时代&#xff0c;基于人工智能和大数据技术的设备报修系统已经成为企业提高服务质量和效率的重要手段。这种系统可以为用户提供方便快捷的报修方式&#xff0c;例如通过扫描设备上的二维码或通过公众号、企业微信、钉钉等平台提交报修请求。这种报修系统不仅可以提高故…

学习笔记:ROS使用经验(rviz)

rviz_config.rviz里面的参数是什么结构 在RViz中的配置文件&#xff08;例如rviz_config.rviz&#xff09;使用YAML格式来定义不同的可视化参数和设置。以下是一些常见的参数结构&#xff1a; Class: 指定显示或组件的类别&#xff0c;如rviz/PointCloud2、rviz/MarkerArray、…

香港服务器快还是台湾服务器快?

​  基于机房位置不同&#xff0c;香港服务器相对于台湾服务器在访问速度方面有一定的优势。香港服务器拥有CN2线路&#xff0c;因此访问速度较快。在网络服务商方面&#xff0c;中华电信等台湾服务商提供的带宽也具有很高的性价比。 香港服务器对大陆用户的影响 对于大陆用户…

Springboot - 3.容器集成

Web容器 当选择Web容器时&#xff0c;你可以在Spring Boot应用中集成不同的容器。下面是Undertow、Tomcat、Jetty、Netty、WebLogic、WebSphere和WildFly这些常见Web容器的比较&#xff0c;包括它们的特点和优缺点&#xff1a; 容器特点优点缺点Undertow轻量级、嵌入式支持、…

详解html中的doctype

选择什么样的DOCTYPE XHTML 1.0中有3种DTD&#xff08;文档类型定义&#xff09;声明可以选择&#xff1a;过渡的&#xff08;Transitional&#xff09;、严格的&#xff08;Strict&#xff09;和框架的&#xff08;Frameset&#xff09;。这里分别介绍如下。 1&#xff0e…

如何增长LLM推理token,从直觉到数学

背景&#xff1a; 最近大模型输入上文长度增长技术点的研究很火。为何要增长token长度,为何大家如此热衷于增长输入token的长度呢&#xff1f;其实你如果是大模型比价频繁的使用者&#xff0c;这个问题应该不难回答。增长了输入token的长度&#xff0c;那需要多次出入才能得到…

软考:中级软件设计师:信息系统的安全属性,对称加密和非对称加密,信息摘要,数字签名技术,数字信封与PGP

软考&#xff1a;中级软件设计师:信息系统的安全属性 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

关于JVM的参数类型

JVM参数类型&#xff0c;主要是可以分为三类。分别是&#xff1a; 标准参数 例如&#xff1a; -help-server-client-version-showversion-cp-classpath 等等&#xff0c;这类参数的特点是在jdk各版本里基本不会变的&#xff0c;相对稳定。 X参数 X参数也就是非标准化参数&am…

W5500-EVB-PICO通过SNTP获取网络时间(十一)

前言 上一章我们用W5500_EVB_PICO 开发板做Ping数据测试IP检测连通性&#xff0c;那么本章我们进行W5500_EVB_PICO SNTP的测试。 什么是NTP&#xff1f; NTP(Network Time Protocol&#xff09;网络时间协议基于UDP&#xff0c;用于网络时间同步的协议&#xff0c;使网络中的计…