当前位置: 首页 > news >正文

Promise总结

Promise.then() 的返回值仍然是 Promise 对象

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body></body><script>let p = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("返回值");}, 1000);});const backP = p.then((res) => {console.log("----打印:", res);//   return "你好"return Promise.resolve(res + "成功的promise");});const finallyBackP = backP.then((res) => {console.log("----打印:", res);return Promise.reject("最后是失败的promise");});setTimeout(() => {console.log("----打印:backP", backP);}, 2000);setTimeout(() => {console.log("----打印:finallyBackPP", finallyBackP);}, 3000);//执行结果// ----打印: 返回值// ----打印: 返回值成功的promise// ----打印:backP Promise {<fulfilled>: '返回值成功的promise'}// ----打印:finallyBackPP Promise {<rejected>: '最后是失败的promise'}</script>
</html>

Promise.all 方法
Promise.all 是 JavaScript 中 Promise 对象的一个静态方法,它接受一个可迭代对象(通常是数组)作为参数,这个可迭代对象的每个成员都是一个 PromisePromise.all 会等待所有的 Promise 都成功解决(fulfilled)后,才完成(fulfill)它自身返回的 Promise,并且会返回一个包含所有 Promise 结果的数组。如果任何一个 Promise 被拒绝(rejected),Promise.all 将立即拒绝,并返回第一个被拒绝的 Promise 的结果。

下面是 Promise.all 的一些关键特性和用法:

基本用法

let promise1 = Promise.resolve(3);
let promise2 = Promise.resolve(4);
let promise3 = 42; // 非Promise对象会被立即视为已解决的PromisePromise.all([promise1, promise2, promise3]).then(values => {console.log(values); // 输出: [3, 4, 42]
});

在这个例子中,Promise.all 接受一个包含三个 Promise 的数组。所有 Promise 都成功解决后,Promise.all 返回的 Promise 也会解决,并返回包含所有结果的数组。

错误处理

let promise1 = Promise.reject('error1');
let promise2 = Promise.resolve(4);Promise.all([promise1, promise2]).catch(error => {console.log(error); // 输出: 'error1'
});

如果 promise1 被拒绝,Promise.all 将立即拒绝,并跳过其他 Promise 的结果,即使 promise2 成功解决。

Promise.allSettled 的区别

Promise.allSettled 是另一个静态方法,它不管 Promise 的结果如何,都会等待所有 Promise 结束(无论是解决还是拒绝),然后返回一个对象数组,每个对象包含对应的 Promise 结果。

应用场景

Promise.all 常用于需要并行处理多个异步操作,并且只有当所有操作都完成后才能继续执行的场景。例如,同时从多个源加载数据,只有所有数据都加载完成后,才能进行下一步处理。

注意事项

  • Promise.all 会立即执行,即使传入的数组为空。
  • 如果传入的可迭代对象中包含非 Promise 对象,它们会被立即视为已解决的 Promise,其结果就是它们自身。
  • 如果 Promise.all 的参数不是一个可迭代对象,将会抛出一个错误。

Promise.all 是并发处理异步操作的强大工具,正确使用它可以显著提高程序的效率和响应性。

var p1 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p1--3000");}, 3000);
});
var p2 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p2--1000");}, 1000);
});
var p3 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印:看看是先执行失败,还是全部执行完再catch");resoleve("p3--5000");}, 5000);
});//第一情况var promiseArr = [p1, p2, p3];console.time("promiseArr");Promise.all(promiseArr).then((res) => {console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]console.timeEnd("promiseArr"); // promiseArr: 5.020s}).catch((err) => console.log(err));//另外情况
var p4 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p4--2000");}, 2000);
});var promiseArr = [p1, p2, p3, p4];
console.time("promiseArr");
Promise.all(promiseArr).then((res) => {console.log("res", res);console.timeEnd("promiseArr");}).catch((err) => console.log(err)); //打印顺序
//p4--2000
//输出----打印:看看是先执行失败,还是全部执行完再catch //解释:p3的输出,比上边catch晚输出因此,如果有失败状态,就会提前结束、去执行all里面的回调函数

Promise.any
截至目前(2023年),Promise.any 是一个相对较新的 JavaScript 特性,它并不是 ECMAScript 标准的一部分,而是在一些现代浏览器和 Node.js 版本中作为实验性特性提供。这个方法与 Promise.race 类似,但是它的行为是等待第一个解决的 Promise 而不是第一个拒绝的。

基本用法

Promise.any 接受一个可迭代对象(通常是数组),其中的每个成员都是一个 Promise 对象。如果数组中至少有一个 Promise 成功解决,Promise.any 返回的 Promise 将解决,并返回第一个解决的 Promise 的结果。如果所有传入的 Promise 都被拒绝,Promise.any 返回的 Promise 也会被拒绝,并返回一个包含所有拒绝原因的聚合错误。

let promise1 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error1'));
let promise2 = new Promise((resolve, reject) => setTimeout(resolve, 50, 'success'));Promise.any([promise1, promise2]).then(value => {console.log(value); // 输出: 'success'
}).catch(error => {console.error(error);
});

在这个例子中,promise2 是第一个解决的 Promise,所以 Promise.any 返回的 Promise 将解决并返回 'success'

错误处理

如果所有传入的 Promise 都被拒绝,Promise.any 返回的 Promise 将被拒绝,并返回一个 AggregateError 对象,它是 Error 的一个子类,包含所有拒绝的原因。

let promise1 = Promise.reject('error1');
let promise2 = Promise.reject('error2');Promise.any([promise1, promise2]).catch(error => {console.log(error); // AggregateErrorconsole.log(error.errors); // ['error1', 'error2']
});

应用场景

Promise.any 适用于以下场景:

  • 当你想要快速尝试多个异步操作,只关心第一个成功的结果。
  • 当你想要实现超时逻辑,例如,尝试多个服务直到一个服务成功响应,或者在超时前等待第一个响应。

注意事项

  • Promise.any 并不广泛支持,使用前需要检查环境是否支持。
  • 如果传入的可迭代对象为空,Promise.any 返回的 Promise 将立即被拒绝,并返回一个 AggregateError,其 errors 属性为空数组。
  • 如果传入的可迭代对象中包含非 Promise 对象,它们会被立即视为已解决的 Promise,其结果就是它们自身。
    Promise.any 提供了一种新的方式来处理多个异步操作,允许开发者更快地响应第一个成功的结果,同时优雅地处理所有操作失败的情况。
    code
var p1 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p1--3000");}, 3000);
});
var p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});
var p3 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印p3");resoleve("p3--5000");}, 5000);
});var promiseArr = [p1, p2, p3];
console.time("promiseArr");
Promise.any(promiseArr).then((res) => {console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]console.timeEnd("promiseArr"); // promiseArr: 5.020s}).catch((err) => console.log(err));//输出顺序 --虽然p2已经执行完,但是为rejected状态,而any会返回第一个resolve状态的对象
//   res p1--3000
// promiseArr: 3.009s
// ----打印p3//另外一种情况
var p1 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p1--3000");}, 3000);
});
var p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});
var p3 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印p3");reject("p3--5000");}, 5000);
});var promiseArr = [p1, p2, p3];
console.time("promiseArr");
Promise.any(promiseArr).then((res) => {console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]console.timeEnd("promiseArr"); // promiseArr: 5.020s}).catch((err) => console.log(err));//输出结果   解释--因为p1,2,3都是错误,所以any一直在等有成功的状态,所以知道p3结束后,没有成功的,就走catch那边
// ----打印p3
// [AggregateError: All promises were rejected] {
//   [errors]: [ 'p1--3000', 'p2--1000', 'p3--5000' ]
// }

Promise.race
方法接收的参数和.all、.any接收的参数一样,接收一个可迭代promise对象的数组,当任何一个promise的状态先确定(拒绝或者成功),则会执行.race中的回调函数,具体根据promise的状态 —和allSettled效果互斥

var p1 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印:p1");resoleve("p1--3000");}, 3000);
});let p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});Promise.race([p1, p2]).then((res) => {console.log("----打印:res", res);}).catch((err) => {console.log("----打印:err", err);});//执行结果
//----打印:err p2--1000
//----打印:p1//另外情况let p3 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p3--500");}, 500);
});Promise.race([p1, p2, p3]).then((res) => {console.log("----打印:res", res);}).catch((err) => {console.log("----打印:err", err);});//打印结果
// ----打印:res p3--500
// ----打印:p1

Promise.allSettled

var p1 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印:p1");resoleve("p1--3000");}, 3000);
});let p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});let p3 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p3--500");}, 500);
});let p4 = new Promise((resolve, reject) => {throw new Error("抛出错误");
});Promise.allSettled([p1, p2, p3, p4]).then((result) => {console.log("----打印:result", result);}).catch((err) => {console.log("----打印:", err); //不执行});//执行结果
// ----打印:p1
// ----打印:result [
//   { status: 'fulfilled', value: 'p1--3000' },
//   { status: 'rejected', reason: 'p2--1000' },
//   { status: 'fulfilled', value: 'p3--500' },
//   {
//     status: 'rejected',
//     reason: Error: 抛出错误
//   }
// ]

相关文章:

Promise总结

Promise.then() 的返回值仍然是 Promise 对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>D…...

ROI 接口便捷修改

传入的图片截取ROI后再进入识别接口 &#xff08;识别接口比ROI接口的函数参数少一个传入的ROI&#xff09; 无点只有点集 返回双点集 //平直冷侧翅片 bool ImageProcessingTest::straightColdSideFin_ROI(cv::Mat img, cv::Rect ROI, std::vector<cv::Point>& topL…...

jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar

jenkins打包boot项目 自动重启脚本失败 查看了一下项目日志报错&#xff1a; Error: Unable to access jarfile tlm-admin.jar我检查了一下这个配置&#xff0c;感觉没有问题&#xff0c;包可以正常打&#xff0c; cd 到项目目录下面&#xff0c;手动执行这个sh脚本也是能正常…...

SQL Server设置端口:跨平台指南

在使用SQL Server时&#xff0c;设置或修改其监听的端口是确保数据库服务安全访问和高效管理的重要步骤。由于SQL Server可以部署在多种操作系统上&#xff0c;包括Windows、Linux和Docker容器等&#xff0c;因此设置端口的步骤和方法也会因平台而异。本文将为您提供一个跨平台…...

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…...

TensorBoard ,PIL 和 OpenCV 在深度学习中的应用

重要工具介绍 TensorBoard&#xff1a; 是一个TensorFlow提供的强大工具&#xff0c;用于可视化和理解深度学习模型的训练过程和结果。下面我将介绍TensorBoard的相关知识和使用方法。 TensorBoard 简介 TensorBoard是TensorFlow提供的一个可视化工具&#xff0c;用于&#x…...

【超音速 专利 CN117576413A】基于全连接网络分类模型的AI涂布抓边处理方法及系统

申请号CN202311568976.4公开号&#xff08;公开&#xff09;CN117576413A申请日2023.11.22申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司发明人&#xff08;公开&#xff09;张俊峰&#xff08;总&#xff09;; 杨培文&#xff08;总&#xff09;; 沈俊羽…...

iPhone数据恢复篇:iPhone 数据恢复软件有哪些

问题&#xff1a;iPhone 15 最好的免费恢复软件是什么&#xff1f;我一直在寻找一个恢复程序来恢复从iPhone中意外删除的照片&#xff0c;联系人和消息&#xff0c;但是我有很多选择。 谷歌一下&#xff0c;你会发现许多付费或免费的iPhone数据恢复工具&#xff0c;声称它们可…...

Html5+Css3学习笔记

Html5 CSS3 一、概念 1.什么是html5 html: Hyper Text Markup Language ( 超文本标记语言) 文本&#xff1a;记事本 超文本&#xff1a; 文字、图片、音频、视频、动画等等&#xff08;网页&#xff09; html语言经过浏览器的编译显示成超文本 开发者使用5种浏览器&#xf…...

WPF学习(2) -- 样式基础

一、代码 <Window x:Class"学习.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008&…...

独家揭秘!五大内网穿透神器,访问你的私有服务

本文精心筛选了五款炙手可热的内网穿透工具&#xff0c;它们各怀绝技&#xff0c;无论您是企业用户、独立开发者&#xff0c;还是技术探索者&#xff0c;这篇文章都物有所值&#xff0c;废话不多说&#xff0c;主角们即将上场。 目录 1. 巴比达 - 安全至上的企业护航者 2. 花…...

Ubuntu 编译和运行ZLMediaKit

摘要 本文描述了如何在Ubuntu上构建ZLMediaKIt项目源码&#xff0c;以及如何体验其WebRTC推流和播放功能。 实验环境 操作系统版本&#xff1a;Ubuntu 22.04.3 LTS gcc版本&#xff1a;11.4.0 g版本&#xff1a;11.4.0 依赖库安装 #让ZLMediaKit媒体服务器具备WebRTC流转发…...

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…...

Hive的基本操作(创建与修改)

必备知识 数据类型 基本类型 类型写法字符char, varchar, string✔整数tinyint, smallint, int✔, bigint✔小数float, double, numeric(m,n), decimal(m,n)✔布尔值boolean✔时间date✔, timestamp✔ 复杂类型(集合类型) 1、数组&#xff1a;array<T> 面向用户提供…...

Linux开发讲课37--- ARM的22个常用概念

1. ARM中一些常见英文缩写解释 MSB&#xff1a;最高有效位&#xff1b; LSB&#xff1a;最低有效位&#xff1b; AHB&#xff1a;先进的高性能总线&#xff1b; VPB&#xff1a;连接片内外设功能的VLSI外设总线&#xff1b; EMC&#xff1a;外部存储器…...

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)

7-1、2、3 IPFS介绍使用及浏览器交互&#xff08;react区块链实战&#xff09; 7-1 ipfs介绍7-2 IPFS-desktop使用7-3 reactipfs-api浏览器和ipfs交互 7-1 ipfs介绍 IPFS区块链上的文件系统 https://ipfs.io/ 这个网站本身是需要科学上网的 Ipfs是点对点的分布式系统 无限…...

CentOS 7 中出现 cannot open Packages database in /var/lib/rpm 错误

转载自:https://www.jianshu.com/p/423306f43e72 # 进入 rpmdb 所在目录 [roothostbase ~]# cd /var/lib/rpm [roothostbase rpm]# ls Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Ins…...

【java深入学习第6章】深入解析Spring事件监听机制

在Spring框架中&#xff0c;事件监听机制是一个强大且灵活的功能&#xff0c;允许我们在应用程序中发布和监听事件。这种机制可以帮助我们实现松耦合的设计&#xff0c;使得不同模块之间的通信更加灵活和可维护。本文将详细介绍Spring的事件监听机制&#xff0c;并通过代码示例…...

Flask与Celery实现Python调度服务

文章目录 Flask与Celery实现Python调度服务一、前言1.组件2.场景说明3.环境 二、安装依赖1.安装Anaconda3.安装redis2.安装依赖包 三、具体实现1.目录结构2.业务流程3.配置文件4.Celery程序5.Flask程序6.测试脚本7.程序启动1&#xff09;Windows开发调试2&#xff09;Linux服务…...

Eureka应用场景和优势

Eureka是一款由Netflix开源的服务注册与发现框架&#xff0c;在微服务架构中扮演着至关重要的角色。以下是Eureka的应用场景和优势&#xff1a; Eureka的应用场景 Eureka主要应用于微服务架构中&#xff0c;特别是在大型、复杂的分布式系统中&#xff0c;用于管理和发现服务。…...

prompt第三讲-PromptTemplate

文章目录 前提回顾PromptTemplateprompt 模板定义以f-string渲染格式以mustache渲染格式以jinja2渲染格式直接实例化PromptTemplatePromptTemplate核心变量 prompt value生成invokeformat_prompt(不建议使用)format(不建议使用) batchstreamainvoke PromptTemplate核心方法part…...

卷积神经网络图像识别车辆类型

卷积神经网络图像识别车辆类型 1、图像 自行车: 汽车: 摩托车: 2、数据集目录 3、流程 1、获取数据,把图像转成矩阵,并随机划分训练集、测试集 2、把标签转为数值,将标签向量转换为二值矩阵 3、图像数据归一化,0-1之间的值 4、构造卷积神经网络 5、设置图像输入…...

【接口设计】用 Swagger 实现接口文档

用 Swagger 实现接口文档 1.配置 Swagger1.1 添加 Swagger 依赖1.2 创建 Swagger 配置类 2.编写接口文档 在项目开发中&#xff0c;一般都是由前后端工程师共同定义接口&#xff0c;编写接口文档&#xff0c;之后大家根据这个接口文档进行开发、维护。为了便于编写和维护稳定&a…...

TensorFlow系列:第四讲:MobileNetV2实战

一. 加载数据集 编写工具类&#xff0c;实现数据集的加载 import keras""" 加载数据集工具类 """class DatasetLoader:def __init__(self, path_url, image_size(224, 224), batch_size32, class_modecategorical):self.path_url path_urlself…...

Redis+Caffeine 实现两级缓存实战

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的&#xff0c;前段时间接了个需求&#xff0c;给公司的商城官网提供一个查询预计送达时间的接口。接口很简单&#xff0c;根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…...

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块&#xff0c;用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点&#xff08;endpoints&#xff09;&#xff0c;用于获取应用程序的健康状态、性能指标、配置信息等&#xff0c;并支持通过 HTTP …...

STM32-I2C硬件外设

本博文建议与我上一篇I2C 通信协议​​​​​​共同理解 合成一套关于I2C软硬件体系 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 特点&#xff1a; 多主机功能&#x…...

暑假第一次作业

第一步&#xff1a;给R1,R2,R3,R4配IP [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1-Serial4/0/0]ip address 15.0.0.1 24 [R2-GigabitEthernet0/0/0]ip address 192.168.2.1 24 [R2-Serial4/0/0]ip address 25.0.0.1 24 [R3-GigabitEthernet0/0/0]ip address 192.…...

【算法专题】快速排序

1. 颜色分类 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 依据题意&#xff0c;我们需要把只包含0、1、2的数组划分为三个部分&#xff0c;事实上&#xff0c;在我们前面学习过的【算法专题】双指针算法-CSDN博客中&#xff0c;有一道题叫做移动零&#xff0c;题目要…...

debian 12 PXE Server 批量部署系统

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…...