Promise.all使用

故事背景:

在JavaScript中,经常会遇到需要同时执行多个异步操作的情况。而Promise.all方法提供了一种便捷的方式来处理这种情况,可以同时处理多个Promise对象,并等待它们全部完成后再执行后续操作。

Promise.all接受一个Promise对象数组作为参数,并返回一个新的Promise对象。这个新的Promise对象将在所有的输入Promise对象都变为resolved状态后变为resolved,或者在任何一个输入Promise对象变为rejected状态后变为rejected。

 实例:

比如下边这个方法中,我需要循环多次请求数据,最终把数据放到endTreeData中,但是实际我这样写在 console.log(endTreeData) 的时候你可能会看到 endTreeData 是等于🈳️或者是不全的。

因为在代码中console.log(endTreeData)语句位于循环之后,但是这些代码会在循环结束后立即执行,而不会等待异步请求的结果返回。

这时就要对代码进行改造了:

initRoleTreeOfManagements() {const manageUnitUUIDs = ['1', '2', '3', '4'];const manageUnitNames = ['一厂', '二厂', '三厂', '四厂'];const endTreeData = [];manageUnitUUIDs.map((manageUnitUUID, index) => {return pbService('service.Service', 'queryListByAttr', {query_fields: {sysisdelete: '0',manage_unit_uuid: manageUnitUUID,},result_fields: 'uuid,name,uuid',order_fields: '',}).then(res => {if (res && res.resultset) {res.resultset.push({role_name: manageUnitNames[index],app_uuid: this.$TREE_ROOT,});endTreeData.push(...res.resultset);}})});console.log(endTreeData)this.roleTreeData = loopTreeData(endTreeData, this.$TREE_ROOT, {idFiled: 'uuid',nameField: 'name',parentField: 'uuid',});},

改造后法示例:

initRoleTreeOfManagements() {const manageUnitUUIDs = ['1', '2', '3', '4'];const manageUnitNames = ['一厂', '二厂', '三厂', '四厂'];const endTreeData = [];const promises = manageUnitUUIDs.map((manageUnitUUID, index) => {return pbService('service.Service', 'queryListByAttr', {query_fields: {sysisdelete: '0',manage_unit_uuid: manageUnitUUID,},result_fields: 'uuid,name,uuid',order_fields: '',}).then(res => {if (res && res.resultset) {res.resultset.push({role_name: manageUnitNames[index],app_uuid: this.$TREE_ROOT,});endTreeData.push(...res.resultset);}})});console.log(endTreeData)Promise.all(promises).then(() => {this.roleTreeData = loopTreeData(endTreeData, this.$TREE_ROOT, {idFiled: 'uuid',nameField: 'name',parentField: 'uuid',});},

在上面的示例中,我增加了请求返回Promise对象。使用Promise.all将这三个Promise对象组合在一起,并在所有的Promise对象都变为resolved状态后获取它们的结果。

值得注意的是,Promise.all返回的Promise对象本身不会等待所有的异步操作完成,而是在所有的Promise对象都变为resolved状态或者有一个Promise对象变为rejected状态后立即返回

因此,如果其中一个异步操作较慢或者失败了,整个Promise.all的结果都将失败。

总结 

使用Promise.all可以方便地处理多个异步操作,并在它们全部完成后执行后续操作。

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

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

相关文章

JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1 2.17 模拟Spring IOC容器功能-2 什么是IOC? 控制反转,把对象创建和对象之间的调用过程交给Spring框架进行管理使用IOC的目的:为了耦合度降低 解释: 模仿 IOC容器的功能,我们利用 Map…

LLM - 大语言模型的指令微调(Instruction Tuning) 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137009993 大语言模型的指令微调(Instruction Tuning)是一种优化技术,通过在特定的数据集上进一步训练大型语言模型(LLMs)&a…

【算法 高级数据结构】树状数组:一种高效的数据结构(二)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:算法题、 基础算法、数据结构~赶紧来学算法吧 💡往期推荐: 【算法基础 & 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定…

RTthread如何引入webclient和cjson来编写自己的模块代码||SecureCRT的安装与激活||安装VScode

目录 1.RTthread如何引入webclient和cjson来编写自己的模块代码 2.SecureCRT的安装与激活 3.static与const的区别 4.安装VScode 1.RTthread如何引入webclient和cjson来编写自己的模块代码 以我自己的工程为例: 首先将新引入的模块在applicatons下新建cpeinfo文件…

【MySQL】一条 SQL 查询语句在数据库中的执行流程 | SQL语句中各个关键字的执行顺序

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

【HTML】打造你的网络名片:制作一个简单的HTML个人网页

目录 前言 流程 1. 规划你的网页内容 2. 选择合适的工具 3. 设计网页布局 HTML结构示例 4. 编写HTML代码 头部&#xff08;Header&#xff09; 关于我&#xff08;About Me&#xff09; 作品集&#xff08;Portfolio&#xff09; 博客/文章&#xff08;Blog/Article…

知识图表示学习中的负抽样研究综述

摘要 知识图表示学习(KGRL)或知识图嵌入(KGE)在知识构建和信息探索的人工智能应用中起着至关重要的作用。这些模型旨在将知识图中的实体和关系编码到低维向量空间中。在KGE模型的训练过程中&#xff0c;使用正样本和负样本是区分的必要条件。然而&#xff0c;直接从现有的知识…

Linux: network:interrupt: python tool

一个小工具可以用来统计interrupt dump出来的数据。然后再导入到excel里倒是可以看出 中断的趋势。 import sys import glob import re file_name=sys.argv[1] f_trace = open(file_name, r) f_message = open(file_name+.out,

鸿蒙NXET实战:高德地图定位SDK【获取Key+获取定位数据】(二)

如何申请key 1、创建新应用 进入[控制台]&#xff0c;创建一个新应用。如果您之前已经创建过应用&#xff0c;可直接跳过这个步骤。 2、添加新Key 在创建的应用上点击"添加新Key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次&#xff1a;输入应用名名称&…

Muduo类详解之EventLoop

最核⼼的部分就是 EventLoop 、 Channel 以及 Poller 三个类&#xff0c;其中 EventLoop 可以看作是对业务线程的封装&#xff0c;⽽ Channel 可以看作是对每个已经建⽴连接的封装&#xff08;即 accept(3) 返回的⽂件描述符&#xff09; EventLoop class EventLoop { p…

解决SLF4J: Class path contains multiple SLF4J bindings.

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 SpringBoot 版本&#xff1a;v2.5.7 maven版本&#xff1a;3.6.3 文章目录 问题描述&#xff1a;原因分析&#xff1a;解决方案&#xff1a;参考资料&#xff1a; 问题描述&#xff1a; 当SpringBoot项目…

并发VS并行

参考文章 面试必考的&#xff1a;并发和并行有什么区别&#xff1f; 并发&#xff1a;一个人同时做多件事&#xff08;射击游戏队友抢装备&#xff09; 并行&#xff1a;多人同时处理同一件事&#xff08;射击游戏敌人同时射击对方&#xff09;

系统学习Python——装饰器:“私有“和“公有“属性案例-[Python不是关于控制]

分类目录&#xff1a;《系统学习Python》总目录 既然我已经用如此大的篇幅实现了Python代码的Private和Public属性声明&#xff0c;必须再次提醒&#xff0c;像这样为类添加访问控制不完全是Python的风格。实际上&#xff0c;除了充当装饰器使用的一个展示&#xff0c;大多数程…

解决ros2缺少cv_bridge包的问题——cv_bridge源码编译安装过程

安装流程 注意&#xff1a;cv_bridge 依赖boost 和 opencv 首先&#xff0c;和编译ros2功能包一样&#xff0c;先创建一个工作空间 mkdir -p cv_bridge_ws/src cd cv_bridge_ws/src然后&#xff0c;在src目录下&#xff0c;下载vision_opencv的源码,注意将-b galactic替换成…

制作 configure 文件极简教程

The magic behind configure, make, make install - How it works in Unix (thoughtbot.com) 如果要发布自己的源码&#xff0c;而自己的源码想通过configure&#xff0c;make&#xff0c;make install 编译安装&#xff0c;那么要为自己的源码建立 configure 文件&#xff0…

uniapp 安卓跳转到应用设置等页面

// #ifdef APP-PLUS const platform uni.getSystemInfoSync().platform if (platform android) {var main plus.android.runtimeMainActivity(); //获取activityvar pkName main.getPackageName();var Intent plus.android.importClass(android.content.Intent); var Set…

学习数据结构:算法的时间复杂度和空间复杂度

一、算法的复杂度 衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢&#xff0c;而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的…

SAP BAS中Fiori开发的高阶功能(storyboard, navigation, guided development, variant)

1. 前言 在之前的几篇文章中&#xff0c;我介绍了SAP BAS的一些基本功能&#xff0c;包括账户申请&#xff0c;创建工作区&#xff0c;git的使用以及如何step-by-step去创建出你的第一个Fiori项目等等。在本篇中&#xff0c;我将进一步介绍一些在开发Fiori应用程序时会用到的高…

JAVA学习笔记19(面向对象编程)

1.面向对象编程 1.1 类与对象 1.类与对象的概念 ​ *对象[属性]/[行为] ​ *语法 class cat {String name;int age; }main() {//cat1就是一个对象//创建一只猫Cat cat1 new Cat();//给猫的属性赋值cat1.name "123";cat1.age 10; }​ *类是抽象的&#xff0c;…

前端使用正则表达式进行校验

一、定义 设计思想是用一种描述性的语言定义一个规则&#xff0c;凡是符合规则的字符串&#xff0c;我们就认为它“匹配”了&#xff0c;否则&#xff0c;该字符串就是不合法的。 在 JavaScript中&#xff0c;正则表达式也是对象&#xff0c;构建正则表达式有两种方式&#x…