Promise类方法

news2024/9/24 15:27:32

这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个),所以这篇就简单说一下,也挺简单

1. all 

Promise.all方法我们可以传入一个数组参数,数组中可以放多个Promise,它会等所有的Promise的状态都为fulfilled时,来获取最终的结果,它会把所有每个Promise resolve的结果,放在一个数组中,且结果的顺序和我们传入的数组参数中的Promise保持一直(跟时间无关)

const p1 = new Promise((resolve, reject) => {
  const obj = { data: '11111' }
  setTimeout(() => {
    resolve(obj)
  }, 3000)
})

const p2 = new Promise((resolve, reject) => {
  const obj = { data: '22222' }
  setTimeout(() => {
    resolve(obj)
  }, 2000)
})

const p3 = new Promise((resolve, reject) => {
  const obj = { data: '33333' }
  setTimeout(() => {
    resolve(obj)
  }, 1000)
})

Promise.all([p1, p2, p3]).then(result => {
  console.log(result)
}).catch(err => {
  console.log('err:', err)
})

 上面代码会在3s后在then方法中拿到最终的结果如下:

但是all方法是有个缺陷的,当有其中一个Promise变成rejected状态时,新Promise就会立即变成对应的reject状态,也就是只能在catch中捕获到错误,其他fulfilled状态的值我们是拿不到的。因此有了allSettled方法

2.  allSettled

allSettled是在ES11(2020)中添加的新的API,Promise.allSettled

该方法会在所有的Promise都有结果时(无论是fulfilled,还是rejected)都会在then方法中拿到我们的最终的结果: 

const p1 = new Promise((resolve, reject) => {
  const obj = { data: '11111' }
  setTimeout(() => {
    resolve(obj)
  }, 3000)
})

const p2 = new Promise((resolve, reject) => { 
  const obj = { data: '22222' }
  setTimeout(() => {
    reject(obj)
  }, 2000)
})

const p3 = new Promise((resolve, reject) => {
  const obj = { data: '33333' }
  setTimeout(() => {
    resolve(obj)
  }, 1000)
})

Promise.allSettled([p1, p2, p3]).then(result => {
  console.log(result)
}).catch(err => {
  console.log('err:', err)
})

我们传入了三个Promise,在2s的时候我们的p2就reject拒绝了,但是我们同样可以拿到结果,但是这个result结果数组结构有点儿变化,我们看下打印结果: 

 我们可以看到allSettled的结果是一个数组,数组中存放着每一个Promise的结果,并且是对应一个对象的;这个对象中包含status状态,以及对应的value值

3.  race

race是竞技、赛跑的意思,也就是谁先有结果我就要谁,这个result拿到的结果就不是一个数组了,而是最快的一个Promise resolve出来的结果 

const p1 = new Promise((resolve, reject) => {
  const obj = { data: '11111' }
  setTimeout(() => {
    resolve(obj)
  }, 3000)
})

const p2 = new Promise((resolve, reject) => { 
  const obj = { data: '22222' }
  setTimeout(() => {
    resolve(obj)
  }, 2000)
})

const p3 = new Promise((resolve, reject) => {
  const obj = { data: '33333' }
  setTimeout(() => {
    resolve(obj)
  }, 1000)
})

Promise.race([p1, p2, p3]).then(result => {
  console.log(result)
}).catch(err => {
  console.log('err:', err)
})

看下控制台的打印: 

因为p3用时最短,最快,所以result拿到的就是p3resolve出的结果值,但是如果最快的那个reject了呢我们看一下: 

const p1 = new Promise((resolve, reject) => {
  const obj = { data: '11111' }
  setTimeout(() => {
    resolve(obj)
  }, 3000)
})

const p2 = new Promise((resolve, reject) => { 
  const obj = { data: '22222' }
  setTimeout(() => {
    reject('出错了~~~')
  }, 500)
})

const p3 = new Promise((resolve, reject) => {
  const obj = { data: '33333' }
  setTimeout(() => {
    resolve(obj)
  }, 1000)
})

Promise.race([p1, p2, p3]).then(result => {
  console.log(result)
}).catch(err => {
  console.log('err:', err)
})

我们修改一下代码,将p2时间设置为0.5s,且是rejected的状态,我们再看下打印结果: 

直接就会被catch捕获了,这样看来,如果最快的那个状态为rejected状态的话,那我们后面的resolve的状态也拿不到值了。如果我们想拿到最快的fulfilled状态的值,也就是如果前面有reject的,我们就忽略掉,接着等待下一个resolve的,怎么做呢,这就有了any方法

4. any 

const p1 = new Promise((resolve, reject) => {
  const obj = { data: '11111' }
  setTimeout(() => {
    resolve(obj)
  }, 3000)
})

const p2 = new Promise((resolve, reject) => { 
  const obj = { data: '22222' }
  setTimeout(() => {
    reject('出错了~~~')
  }, 500)
})

const p3 = new Promise((resolve, reject) => {
  const obj = { data: '33333' }
  setTimeout(() => {
    resolve(obj)
  }, 1000)
})

Promise.any([p1, p2, p3]).then(result => {
  console.log(result)
}).catch(err => {
  console.log('err:', err)
})

还是上一次的代码,我们把方法改为any,再看一下打印结果: 

我们在1s后就会拿到p3 resolve的结果, 那个p2 reject的就忽略掉了,那如果我们所有的Promise都是rejected状态时它会怎么做呢?我们看一下:

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('出错了111~~~')
  }, 3000)
})

const p2 = new Promise((resolve, reject) => { 
  setTimeout(() => {
    reject('出错了222~~~')
  }, 500)
})

const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('出错了333~~~')
  }, 1000)
})

Promise.any([p1, p2, p3]).then(result => {
  console.log(result)
}).catch(err => {
  console.log('err:', err, err.errors)
})

我们看下打印结果: 

它就会走catch了,并且打印出了错误信息,其中的 err.errors中会有我们reject传递的错误信息,err是它内部封装的错误提示 

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

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

相关文章

Gradle使用

下载Gradle Gradle Distributions 配置环境变量 测试是否成功 cmd输入gradle -v 在.gradle目录下创建一个init.gradle allprojects { repositories { maven { url file:///D:/maven/myRepository} ## 这里是本地maven仓库地址,没有就会依次向下设置的地址寻…

wisp5学习日记1

这里写目录标题 编译工程问题一 LSD-FET430UIF仿真器排针方向与所给排针方向示意图不一致,不知怎么方向问题2 拟器或仿真器无法找到连接到计算机的USB FET 编译工程 鼠标右键选择build project 问题一 LSD-FET430UIF仿真器排针方向与所给排针方向示意图不一致&…

【Java基础 2】Java 基础语法

🍊 Java学习:社区快速通道 文章目录 1 变量与基本数据类型1.1 变量1.2 数据类型1.3 标识符1.4 类型转换1.5 关键字大全 2 二进制概述3 方法4 运算符4.1 算术运算符4.2 赋值运算符4.3 关系运算符4.4 逻辑运算符4.5 字符串连接运算符4.6 三目运算符 5 命名…

配置JDK环境变量

文章目录 查看电脑系统下载及安装JavaSE配置系统环境变量测试环境变量配置是否成功。 查看电脑系统 运行输入框中输入:control 下载及安装JavaSE 这个从网上下载就行,jdk-8u141-windows-x64.exe,不提供下载方式了。 主要讲解安装过程&a…

AI 工具合辑盘点(十二)持续更新 之 面向学生群体的 AI 工具和面向所有人的 AI 工具

面向学生群体的 AI 工具 人工智能在教育领域可以发挥多种作用。例如,它可以用于个性化课程、检测抄袭、转录讲座和促进教师与学生之间的快速沟通等等。 教育面临着许多挑战,这些人工智能工具可以帮助教师和学生。这些 AI 可以替代手动工作、降低人为错…

图解HTTP

文章目录 第一章、了解web及网络基础HTTP 的诞生网络基础 TCP/IPTCP/IP 协议族层次化的好处应用层传输层网络层链路层(又名数据链路层,网络接口层) 数据传输流举例: 与HTTP关系密切的协议:IP、TCP和DNS负责传输的 IP 协…

Simulink 自动代码生成电机控制:开发板DAC接口辅助调试的方法

目录 前言 DAC基本原理 PWM模拟DAC DAC底层代码配置 DAC调试演示 总结 前言 DAC是比较常用的数字转模拟单元,通过给定数字量,输出一个模拟信号,有比较广泛的用途,在这里只讨论DAC作为一个调式手段帮助打印出电机控制里面的一…

【大学物理实验】实验报告数据

写在前面: 1:本文章收集CAU的18个大学物理实验的实验数据,仅供参考。(因为本人很讨厌竞速实验orz) 2:实验之间的差距,不如负责老师之间的差距。以及需要考虑机考的虚拟实验你会不会做。&#…

Linux内核驱动开发(二)

LED设备驱动 LED基本硬件原理(以QT210为例) 通过配置GPIO,把相应的GPIO设置成高电平或低电平,达到点灯。 LED设备驱动的代码 leds_create_device 初始化设备 核心数据结构初始化 设备号 major>0 :指定了设备号…

nexus工作原理及项目配置注意事项

一、nexus工作原理图 私服搭建&#xff0c;可以参考下面链接&#xff1a; 搭建Maven私服Nexus3_石工记的博客-CSDN博客 二、项目配置注意事项&#xff08;两个配置&#xff09; 1.maven中settings的两个配置&#xff1a;添加<server/>&#xff08;不必需项&#xff09…

哈夫曼编码

哈夫曼编码 基本介绍 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%&#xff5e;90%之…

Variable used in lambda expression should be final or effectively final

场景描述 我们在使用Java8 lambda表达式的时候时不时会遇到这样的编译报错&#xff1a; 这句话的意思是&#xff0c;lambda 表达式中使用的变量应该是 final 或者有效的 final&#xff0c;为什么会有这种规定&#xff1f; 匿名类中的局部变量 其实在 Java 8 之前&#xff0…

【iOS】—— RunLoop线程常驻和线程保活

文章目录 没有线程常驻会怎么样&#xff1f; 线程常驻线程保活 没有线程常驻会怎么样&#xff1f; 我们一般写一个子线程&#xff0c;子线程执行完分配的任务后就会自动销毁&#xff0c;比如下面这个情况&#xff1a; 我们先重写一下NSThread里面的dealloc方法&#xff0c;打印…

如何在测试中让H2支持JSONB

如今在开发系统时&#xff0c;有各种各样的数据库供我们选择。之前我们在博客基于MariaDB4j实现持久层单元测试介绍了使用MariaD4j代替作为MySQL的替身执行单元测试&#xff0c;但是并不是所有的数据库都能找到合适的替身来执行单元测试。 今天作者在写测试的过程中就遇到了一…

AutoSar标准官网下载

文章目录 打开官方网站ECU的开发基本遵循标准为Classic Platform选择相应模块&#xff0c;此框图链接为最新标准&#xff0c;也可在下方选择历史版本跳转进来后&#xff0c;可以选择下载所有文档&#xff0c;也可以按需下载Autosar文档命名&#xff1a;AUTOSAR类型模块名称 打开…

2023 年 3 月青少年机器人技术等级考试理论综合试卷(六级)

2023 年 3 月青少年机器人技术等级考试理论综合试卷&#xff08;六级&#xff09; 一、单选题(共 20 题&#xff0c;共 80 分) 1. ESP32 for Arduino I C 类库的成员函数 beginTransmissio()中&#xff0c;下列描述正确的是&#xff1f;&#xff08; C&#xff09; A. 初始化&a…

Java 基础进阶篇(十一)—— 泛型的定义与深入

文章目录 一、泛型概述二、泛型的定义2.1 泛型类2.2 泛型方法2.3 泛型接口 三、泛型深入3.1 泛型通配符3.2 泛型上下限3.3 案例&#xff1a;定义一个 “所有车量进行比赛” 的方法 一、泛型概述 泛型是 JDK5 中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#x…

Illustrator如何绘制图形对象之实例演示?

文章目录 0.引言1.几何图形绘制樱花2.绘制一艘潜水艇3.调整透视网格 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对图…

【C++】 类基础汇总(类封装,构造、析构函数...)

目录 前言 正文 类封装 为什么要进行类封装 概念 访问修饰符 构造函数 概念 特点 析构函数 概念 特点 再谈面向过程与面向对象 面向过程 代码举例 面向对象 代码举例 结语 下期预告 前言 在学习过【C语言进阶C】 C基础--让你丝滑的从C语言进阶到C 之后&am…

Batch v.s. Stream Processing

当处理大数据时&#xff0c;通常使用批处理和流处理两种模型。它们的主要区别如下&#xff1a; 1.输入 批处理处理的是时间边界确定的数据&#xff0c;也就是输入数据有一个结尾。 流处理处理的是数据流&#xff0c;没有明确定义的边界。 2.实时性 批处理通常用于数据不需要实时…