当前位置: 首页 > 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;用于管理和发现服务。…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...