Promise.all解决同时请求同一接口,返回值渲染时间问题

news2025/2/23 6:47:28
语法:Promise.all(iterable);
参数:iterable
一个可迭代对象,如 Array 或 String。
返回值:如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise。
如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise。
其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。
	let p = Promise.all( [await uploadFile(fileParams1),await uploadFile(fileParams2)])
					p.then(arr=>{
					}).catch((e)=>{
						console.log(e)
					}).finally(()=>{
						fileLoading.value = false
					})

Promise.all()使用

  1. Promise.all方法可以把多个promise实例包装成一个新的promise实例;
    Promise.all([promise1,promise2]):Promise—最终返回Promise实例;
  2. 全部加载成功 则返回所有promise实例中resolve()回来带的参数,按数组中一一对应的顺序所集合的数组
    若任意有一个失败 ,立即决议失败,将失败的promise实例(reject()中参数)传递给我们;
  3. 若Promise.all([ ])中,数组为空数组,则立即决议为成功执行resolve( );
  4. Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

数组项全部决议为成功时:

//Promise.all方法可以把多个promise实例 包装成一个新的promise实例
            //Promise.all([ promise1, promise2]) :Promise   接收一个数组,数组中的每一项都是promise实例,最终返回的也是一个promise实例
            
            //它分三种情况,第一种是数组中的所有promise都决议为成功的话,Promise.all就会决议为成功;
            //第二种是数组中任意一个promise实例决议为失败的时候,Promise.all就会立即决议为失败
            //第三种是Promise.all()中是一个空数组的时候,Promise.all就会立即决议为成功
            
            //模拟需要多个请求的数据,才能进行下一步操作的情况


            function getData1(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第一条数据加载成功');
                        resolve('data1');
                    },1000)
                })
            }
            
            function getData2(){
                return new Promise( (resolve,reject) =>{
                    setTimeout( () => {
                        console.log('第二条数据加载成功');
                        resolve('data2');
                    },1000)
                })
            }
            
            function getData3(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第三条数据加载成功');
                        resolve('data3');
                    },1000)
                })
            }
            
            function getData4(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第四条数据加载成功');
                        resolve('data4')
                    },200)
                })
            }
            
            let p = Promise.all( [getData1(), getData2(), getData3(), getData4() ])
            
            p.then(arr => {
                console.log(arr)  // ['data1', 'data2', 'data3', 'data4']
            }, e => {
                console.log(e)
            })

结果如图:
在这里插入图片描述
数组项有一项决议为失败时:

function getData1(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第一条数据加载成功');
                        resolve('data1');
                    },1000)
                })
            }
            
            function getData2(){
                return new Promise( (resolve,reject) =>{
                    setTimeout( () => {
                        console.log('第二条数据加载成功');
                        resolve('data2');
                    },1000)
                })
            }
            
            function getData3(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第三条数据加载成功');
                        resolve('data3');
                    },1000)
                })
            }
            
            function getData4(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第四条数据加载成功');
                        reject('data4 err')
                    },500)
                })
            }
            
            let p = Promise.all( [getData1(), getData2(), getData3(), getData4() ])
            
            p.then(arr => {
                console.log(arr)  
            }, e => {
                console.log(e)  //data4 err
            })

结果如图:
在这里插入图片描述
当数组项为空时,直接决议成功:

function getData1(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第一条数据加载成功');
                        resolve('data1');
                    },1000)
                })
            }
            
            function getData2(){
                return new Promise( (resolve,reject) =>{
                    setTimeout( () => {
                        console.log('第二条数据加载成功');
                        resolve('data2');
                    },1000)
                })
            }
            
            function getData3(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第三条数据加载成功');
                        resolve('data3');
                    },1000)
                })
            }
            
            function getData4(){
                return new Promise( (resolve,reject) => {
                    setTimeout( () => {
                        console.log('第四条数据加载成功');
                        reject('data4 err')
                    },500)
                })
            }
            
            let p = Promise.all( [ ])
            
            p.then(()=> {
                console.log('数组为空')  // 数组为空
            }, e => {
                console.log(e)
            })

结果如图:
在这里插入图片描述

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。

代码模拟:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
  console.log(error)
})

需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

原文直达链接:https://www.cnblogs.com/rickdiculous/p/13580329.html

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

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

相关文章

万能小程序运营管理系统 _requestPost 任意文件读取漏洞复现

0x01 产品简介 万能小程序运营管理系统是一种功能全面的系统,旨在帮助开发者和运营人员更好地管理和推广小程序。该系统集成了多种功能模块,覆盖了从小程序开发、部署到运营管理的全链条服务。系统通过提供丰富的功能和工具,帮助用户轻松搭建、管理和优化小程序。该系统支持…

提高数据集成稳定性:EMQX Platform 端到端规则调试指南

自 5.7.0 版本起,EMQX 支持了 SQL 调试,并支持在数据集成全流程中进行规则调试,使用户能够在开发阶段就全面验证和优化规则,确保它们在生产环境中的稳定高效运行。 点击此处下载 EMQX 最新版本:https://www.emqx.com/z…

JavaSE - 面向对象编程01

01 什么是面向对象编程(oop) 答:就是只关心对象之间的交互,而并不关心任务是怎样具体完成的。例如把一个大象放进冰箱需要几步?如果是面向对象编程只会思考冰箱和大象之间的交互,那么给出的答案就是:把冰箱门打开&…

PyCharm用法

一、汉化 要将‌PyCharm设置为中文,可以通过以下两种方法:‌ 通过内置插件市场安装中文语言包 1.打开PyCharm,点击File -> Settings(在Mac上是PyCharm -> Preferences)。 2.在设置界面中选择Plugins&#x…

[Linux]进程控制详解

1.创建进程 进程调用fork,当控制转移到内核中的fork代码后,内核做: ● 分配新的内存块和内核数据结构给子进程 ● 将父进程部分数据结构内容拷贝至子进程 ● 添加子进程到系统进程列表当中 ● fork返回,开始调度器调度 这个前面提到过&#…

智能玩具用离线语音识别芯片有什么优势

随着科技的发展,很多智能电子产品和儿童玩具实现了与人类的交互,语音芯片在这些人机交互中起到了不可替代的作用,语音识别芯片在智能玩具中的应用就为其带来了更多的优势。‌ 离线语音识别,即小词汇量、低成本的语音识别系统&…

esp32 wifi 联网后,用http 发送hello 用pc 浏览器查看网页

参考chatgpt Esp32可以配置为http服务器,可以socket编程。为了免除编写针对各种操作系统的app。完全可以用浏览器仿问esp32服务器,获取esp32的各种数据,甚至esp的音频,视频。也可以利用浏览器对esp进行各种操作。但esp不能主动仿…

【深度学习】(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader(数据加载器)4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…

【STL】vector 基础,应用与操作

vector 是 C 标准库中最常用的顺序容器之一,提供了动态数组的功能。与普通数组相比,vector 能够根据需求自动扩展或收缩,为程序员提供了更灵活的数据存储方案。本文将详细介绍 vector 的相关操作,并结合实例代码帮助读者深入理解。…

MindShare PCIE 3.0 笔记-第一二章

MindShare 官网,地址如下: MindShare Chapter 1:PCIE 背景介绍 - PCI 总线模型 1. 以 PCI 总线作为外设总线的 SOC 芯片架构 下图展示了一个以 PCI 总线作为外设总线的 SOC 芯片架构(PCI 总线类似 AXI 下的 AHB?): 由上图可知…

Django Auth组件

文章目录 前言一、使用场景二、使用步骤1.验证用户( authenticate() 方法)2.注册用户3.退出登陆4.装饰器 前言 Django 的用户认证组件基于以下几个核心概念: 1.用户认证:处理用户的登录、注销和密码管理,提供了一个User模型和相关的视图、表…

技术美术一百问(02)

问题 前向渲染和延迟渲染的流程 前向渲染和延迟渲染的区别 G-Buffer是什么 前向渲染和延迟渲染各自擅长的方向总结 GPU pipeline是怎么样的 Tessellation的三个阶段 什么是图形渲染API? 常见的图形渲染API有哪些? 答案 1.前向渲染和延迟渲染的流程 【例图…

图神经网络池化方法

图神经网络池化方法 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异&#xff…

软考(中级-软件设计师)(0919)

软考 一、软件设计师-历年考试考点分布情况-上午-计算机与软件工程知识 知识点分数说明比例软件工程基础知识11开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理14.67%面向对象12面向对象基本概念、面向对象分析与设计、UML、常见算法16.00%数据结构与算法10…

代码随想录算法day37 | 动态规划算法part10 |

今天开始正式子序列系列!!!!! 300.最长递增子序列 本题是比较简单的,感受感受一下子序列题目的思路。 力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长…

读mamba有感,自然而然产生的问题及答案。

原文链接:https://arxiv.org/abs/2312.00752 Q:为什么说Mamba可以比肩甚至超越transformer?各自有什么优劣? A:Transformer在处理长序列时,存在着计算效率低下的问题,无法对有限窗口之外的任何…

查询中的行选择

用WHERE子句限制从查询返回的行。一个WHERE子句包含一个必须满足的条件,WHERE子句紧跟着FROM子句。如果条件是true,返回满足条件的行。 在语法中: WHERE 限制查询满足条件的行 condition 由列名、表达式、常数和比较操作组成…

bootstrap application nacos环境配置失效

tmd 环境配置 是yaml ,yml 后缀配置不生效 (不,看你取得文件名是什么) 如果 file-extension 配置的是yaml 就读取不到 yml 中的配置 2 . 如果还不行,、nacos 配置只能卸载bootstrap.yml 中,application.yml 不生效 bootstrap.yml…

c/c++语言中extern的用法(VS编译)

c/c语言中extern的用法 前言:1. 声明外部变量2. 声明外部函数3. 在头文件中使用注意事项 效果展示: 前言: extern 关键字不仅在 C 语言中使用,在 C 语言中也同样适用。它主要用于声明一个变量或者函数是在别的文件或翻译单元中定…

怎么操作使http变成https访问?

获取SSL证书 选择证书颁发机构:可以选择受信任的免费或付费证书颁发机构(CA)如JoySSL 申请和验证域名:注册并填写注册码230920,验证域名所有权。下载SSL证书文件到本地电脑. JoySSL品牌证书 注册享大额优惠JoySSL是网…