await的作用(举例)

问:
当方法a中又三个方法a1、a2、a3、a4都是异步函数,现在在a2、a4追加await,方法执行顺序是什么?主进程顺序是什么?

答:

通过一个具体的例子来说明当方法 a 中有四个异步方法 a1、a2、a3 和 a4,并且在 a2 和 a4 前面加上 await 时,方法的执行顺序和主进程的顺序。

示例代码
假设我们有以下代码:

深色版本
async function a1() {console.log('a1 start');await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒console.log('a1 end');
}async function a2() {console.log('a2 start');await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒console.log('a2 end');
}async function a3() {console.log('a3 start');await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒console.log('a3 end');
}async function a4() {console.log('a4 start');await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒console.log('a4 end');
}async function a() {console.log('a start');a1(); // 不等待 a1 完成await a2(); // 等待 a2 完成a3(); // 不等待 a3 完成await a4(); // 等待 a4 完成console.log('a end');
}a();

执行顺序和主进程顺序

主进程顺序:
  • console.log('a start');:立即执行,输出 a start。

  • a1();:调用 a1,但不等待 a1 完成,立即继续执行后续代码。

  • await a2();:调用 a2 并等待 a2 完成。在这期间,主进程会被阻塞,不会继续执行 a3。

  • a3();:调用 a3,但不等待 a3 完成,立即继续执行后续代码。

  • await a4();:调用 a4 并等待 a4 完成。在这期间,主进程会被阻塞,不会继续执行 console.log(‘a end’);。

  • console.log('a end');:在 a4 完成后执行,输出 a end。

异步方法的执行顺序:
  • a1 开始执行:
    • console.log(‘a1 start’);:立即执行,输出 a1 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。
  • a2 开始执行:
    • console.log(‘a2 start’);:立即执行,输出 a2 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。
  • a3 开始执行:
    • console.log(‘a3 start’);:立即执行,输出 a3 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。
  • a4 开始执行:
    • console.log(‘a4 start’);:立即执行,输出 a4 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。

最终输出顺序:

a start
a1 start
a2 start
a3 start
a2 end
a4 start
a1 end
a3 end
a4 end
a end

解释

主进程顺序:
  • a start:首先输出 a start。
  • a1 被调用,但不等待其完成,继续执行后续代码。
  • a2 被调用,并等待其完成。在这期间,主进程会被阻塞,不会继续执行 a3。
  • a3 被调用,但不等待其完成,继续执行后续代码。
  • a4 被调用,并等待其完成。在这期间,主进程会被阻塞,不会继续执行 console.log(‘a end’);。
  • a end:在 a4 完成后输出 a end。
异步方法的执行顺序:
  • a1、a2、a3 和 a4 都是异步方法,它们会并行执行。
  • a2 和 a4 的异步操作会阻塞主进程,直到它们完成。
  • a1 和 a3 的异步操作不会影响 a2 和 a4 的等待,因为 await 只会阻塞当前的异步函数 a,不会阻塞其他异步方法的执行。

结论

  • 主进程顺序:a start -> a1 start -> a2 start -> a3 start -> a2 end -> a4 start -> a1 end -> a3 end -> a4 end -> a end。
  • 异步方法的执行顺序:a1 start -> a2 start -> a3 start -> a2 end -> a4 start -> a1 end -> a3 end -> a4 end。

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

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

相关文章

Spring Cache 的说明及常用注解

一.介绍 Spring Cache是Spring Framework中的一个模块,用于简化和统一缓存的使用。它提供了一种将缓存逻辑与应用程序业务逻辑分离的方式,使得我们可以更方便地使用缓存来提高应用程序的性能。 二.主要特性 注解支持:Spring Cache提供了一组…

python 自学总结

# 这是一个代码的注释 注释可以使用# 一般而言#号后面要加空格表示规范,多行注释使用“”“ ”“”符合包裹 # type()这个是判断变量类型# 变量的形式 meny 50 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …

Dbt增量策略模型实践指南

参考:dbt Incremental Strategies | Indicium Engineering (medium.com) 本文讨论dbt的增量策略,介绍工作原理、以及各自优缺点。下篇讲解如何在模型中实现增量策略。 使用增量模型可以仅仅处理最近的数据,减少数据处理成本和时间。当然首先要…

Solon 3.0 引入 SqlUtils :数据库操作的反朴归真

Solon 3.0 版本发布后,带了一个新的特性 —— SqlUtils。这一全新的数据库操作框架给开发者提供了更加透明、灵活的数据库交互方式,可显著提升了代码的透明度和维护性。本文将浅入探讨 SqlUtils 的引入背景、使用方法以及它对市场和开发者群体的潜在影响…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix; 2. pytorch 与 pytorch geometric 各…

自动化的抖音

文件命名 main.js var uiModule require("ui_module.js"); if (!auto.service) {toast("请开启无障碍服务");auto.waitFor();} var isRunning true; var swipeCount 0; var targetSwipeCount random(1, 10); var window uiModule.createUI(); uiMo…

ComfyUI | 5分钟部署最新Flux大模型

Midjourney 和 Stable Diffusion 都是目前流行的 AI 图像生成工具,它们能够根据文本描述生成高质量的图像。都是基于深度学习技术的文本到图像生成模型,但它们各自基于不同的大模型。 但最近推出了一款比前两者更强大,生成图像更加逼真&…

windows端口被占用但是查不到进程的问题排查

在开发环境上经常遇到端口被占用,但是 netstat -ano|findstr 3306 查不到进程号,没法强杀解决。 这种情况,很有可能端口被排除了,可用命令: netsh interface ipv4 show excludedportrange protocoltcp 可以看到mysql的…

前端面试题(十四)

76. 前端性能优化 前端性能优化有哪些常见方法? 减少 HTTP 请求: 合并 CSS、JavaScript 和图片文件。使用雪碧图 (Sprite) 减少图片请求数。 资源压缩和合并: 压缩 JavaScript 和 CSS 文件,减少文件体积。使用工具如 UglifyJS、…

一、制作UI自适应

当前分辨率 更改分辨率 一、原因 一款游戏的UI,可能会根据玩家的分辨率和屏幕尺寸,产生不同的变化 例如:某一个Image位移到了摄像机外面 因此需要通过锚点和屏幕自适应来制作完美的效果 二、解决方法 1、锚点 作用是:根据当…

Unity3D相关知识点总结

Unity3D使用的是笛卡尔三维坐标系,并且是以左手坐标系进行展示的。 1.全局坐标系(global) 全局坐标系描述的是游戏对象在整个世界(场景)中的相对于坐标原点(0,0,0)的位置…

前端接收到的日期格式为 2021-12-07T16:44:53.298+00:00 怎么办?

在写项目的时候,给前端发送了一个 Date 类型的数据,发现格式不对: 可以通过在application 配置文件中进行如下配置: spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8 前端在获取就发现格式正确

嵌入式硬件设计:从原理到实践

嵌入式硬件设计:从原理到实践 嵌入式硬件设计在物联网、智能设备、工业自动化等领域中扮演着至关重要的角色。随着技术的发展,越来越多的设备依赖于嵌入式系统进行实时控制与数据处理。本文将详细介绍嵌入式硬件设计的各个方面,从设计原理到…

Study-Oracle-11-ORALCE19C-ADG集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案,它通过在主数据库和一个或多个备用数据库之间实时复制数据,提供了数据的冗余备份和故障切换功能。…

实现一个时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter>//画家类 #include<QTime>//时间类 #include<QTimer>//定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget …

项目管理——Gantt图与Pert图

目录 前言相关知识点相关题目 前言 本文是在关于软考中软件设计师中的项目管理中的知识点&#xff0c;关于Gantt图与Pert图 相关知识点 甘特&#xff08;Gantt&#xff09;图 优点 可以清晰的描述每个任务从何时开始的&#xff0c;到何时结束&#xff0c;任务的进程情况以及…

互联网协议(IP)中最常用的端口

80 端口和 443 端口是互联网协议&#xff08;IP&#xff09;中最常用的两个端口&#xff0c;分别用于 HTTP 和 HTTPS 通信。以下是它们的作用、区别以及相关背景信息&#xff1a; 80 端口和 443 端口的作用 80 端口&#xff1a; 用于 HTTP&#xff08;HyperText Transfer Prot…

C++和OpenGL实现3D游戏编程【连载14】——VBO、VAO和EBO应用

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在&#xff0c;OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成&#xff0c;在此基础之上&#xff0c;才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式&a…

SSM(5)(动态sql <if>、<where>、返回主键值)

返回主键值&#xff1a; 方法一&#xff1a; useGeneratedKeys 为ture 声明 返回主键 keyProperty 表示要返回的值 封装到对象的属性中 但是这一种方法不支持Orcal数据库。 <insert id"save2" parameterType"com.findyou.entity.User" useGenerated…

C++面试速通宝典——23

420. 一个类有一个int和一个char有多大&#xff1f; 假设不考虑虚函数或虚继承&#xff0c;该类的大小通常由以下情况确定&#xff1a; int类型通常占用4个字节char类型占用1个字节 由于内存对齐&#xff0c;编译器可能在int和char之间或者char后面添加填充字节&#xff0c;…