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
对象的一个静态方法,它接受一个可迭代对象(通常是数组)作为参数,这个可迭代对象的每个成员都是一个 Promise
。Promise.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后再进入识别接口 (识别接口比ROI接口的函数参数少一个传入的ROI) 无点只有点集 返回双点集 //平直冷侧翅片 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项目 自动重启脚本失败 查看了一下项目日志报错: Error: Unable to access jarfile tlm-admin.jar我检查了一下这个配置,感觉没有问题,包可以正常打, cd 到项目目录下面,手动执行这个sh脚本也是能正常…...
SQL Server设置端口:跨平台指南
在使用SQL Server时,设置或修改其监听的端口是确保数据库服务安全访问和高效管理的重要步骤。由于SQL Server可以部署在多种操作系统上,包括Windows、Linux和Docker容器等,因此设置端口的步骤和方法也会因平台而异。本文将为您提供一个跨平台…...

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

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

【超音速 专利 CN117576413A】基于全连接网络分类模型的AI涂布抓边处理方法及系统
申请号CN202311568976.4公开号(公开)CN117576413A申请日2023.11.22申请人(公开)超音速人工智能科技股份有限公司发明人(公开)张俊峰(总); 杨培文(总); 沈俊羽…...

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

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

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&…...

独家揭秘!五大内网穿透神器,访问你的私有服务
本文精心筛选了五款炙手可热的内网穿透工具,它们各怀绝技,无论您是企业用户、独立开发者,还是技术探索者,这篇文章都物有所值,废话不多说,主角们即将上场。 目录 1. 巴比达 - 安全至上的企业护航者 2. 花…...
Ubuntu 编译和运行ZLMediaKit
摘要 本文描述了如何在Ubuntu上构建ZLMediaKIt项目源码,以及如何体验其WebRTC推流和播放功能。 实验环境 操作系统版本:Ubuntu 22.04.3 LTS gcc版本:11.4.0 g版本: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、数组:array<T> 面向用户提供…...
Linux开发讲课37--- ARM的22个常用概念
1. ARM中一些常见英文缩写解释 MSB:最高有效位; LSB:最低有效位; AHB:先进的高性能总线; VPB:连接片内外设功能的VLSI外设总线; EMC:外部存储器…...

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)
7-1、2、3 IPFS介绍使用及浏览器交互(react区块链实战) 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框架中,事件监听机制是一个强大且灵活的功能,允许我们在应用程序中发布和监听事件。这种机制可以帮助我们实现松耦合的设计,使得不同模块之间的通信更加灵活和可维护。本文将详细介绍Spring的事件监听机制,并通过代码示例…...
Flask与Celery实现Python调度服务
文章目录 Flask与Celery实现Python调度服务一、前言1.组件2.场景说明3.环境 二、安装依赖1.安装Anaconda3.安装redis2.安装依赖包 三、具体实现1.目录结构2.业务流程3.配置文件4.Celery程序5.Flask程序6.测试脚本7.程序启动1)Windows开发调试2)Linux服务…...
Eureka应用场景和优势
Eureka是一款由Netflix开源的服务注册与发现框架,在微服务架构中扮演着至关重要的角色。以下是Eureka的应用场景和优势: Eureka的应用场景 Eureka主要应用于微服务架构中,特别是在大型、复杂的分布式系统中,用于管理和发现服务。…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...