Promise.all和 race

Promise.all()

  1. all方法可以完成并行任务, 它接收一个数组,数组的每一项都是一个promise对象。
  2. 返回值:
  • 成功时:当数组中所有的promise的状态都达到resolved的时候,就返回包含所有 Promise 结果的数组,并且是按照传递过来的顺序,但是注意的是他们执行的顺序并不是按照顺序的
  • 失败时:传递的任何一个 Promise 被拒绝,返回的 Promise 对象将被拒绝,并将首个被拒绝的 Promise 的结果作为其值。
  1. 当遇到发送多个请求并根据请求顺序获取和使用数据的场景,就可以使用 Promise.all 来解决
let promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve(1);}, 2000);
});
let promise2 = new Promise((resolve, reject) => {setTimeout(() => {resolve(2);}, 1000);
});
let promise3 = new Promise((resolve, reject) => {setTimeout(() => {resolve(3);}, 3000);
});
Promise.all([promise1, promise2, promise3]).then((res) => {console.log(res);//结果为:[1,2,3]
});
const promise1 = new Promise((resolve, reject) => {setTimeout(() => {console.log("进入promise1");resolve("Promise 1 resolved");}, 1000);});const promise2 = new Promise((resolve, reject) => {setTimeout(() => {console.log("进入promise2");resolve("Promise 2 resolved");}, 2000);});const promise3 = new Promise((resolve, reject) => {setTimeout(() => {console.log("进入promise3");reject("Promise 3 rejected");}, 1500);});Promise.all([promise1, promise2, promise3]).then((results) => {console.log("All promises resolved:", results);}).catch((error) => {console.error("At least one promise rejected:", error);});

在这里插入图片描述
从这个输出结果可以看出

  1. 在遇到reject就立即去执行then方法了,不会等到剩下的promise对象执行完;
  2. 即使遇到reject,之后还没执行完的promise会继续执行,只是不会再进入到then中了

如果第三个改成 resolve("Promise 3 resolve"),输出结果:
在这里插入图片描述

当然,失败的时候也可以把catch用then的第二个参数代替:
在这里插入图片描述
输出结果:(这里是console.log,所以和 console.error的输出形式不太一样,但是功能是一样的
在这里插入图片描述

Promise.race()

race方法和all一样,接受的参数是一个每项都是promise的数组,但是与all不同的是,哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。如果第一个promise对象状态变成resolved,那自身的状态变成了resolved;反之第一个promise变成rejected,那自身状态就会变成rejected

  • 使用场景:当你想在多个 Promise 中的任何一个完成时执行某个操作时,可以使用 Promise.race
 let promise1 = new Promise((resolve, reject) => {setTimeout(() => {console.log("进入promise1了");reject(1);}, 2000);});let promise2 = new Promise((resolve, reject) => {setTimeout(() => {console.log("进入promise2了");resolve(2);}, 1000);});let promise3 = new Promise((resolve, reject) => {setTimeout(() => {console.log("进入promise3了");resolve(3);}, 3000);});Promise.race([promise1, promise2, promise3]).then((res) => {console.log(res);//结果:2},(rej) => {console.log(rej);});

在这里插入图片描述

  • 有一个promise进入race的成功回调后,其余函数继续执行,只是将不会再进入race的任何回调

那么race方法有什么实际作用呢?当要做一件事,超过多长时间就不做了,可以用这个方法来解决:

Promise.race([promise1, timeOutPromise(5000)]).then((res) => {});

补充:
Promise.allPromise.race 是 JavaScript 中用于处理多个 Promise 对象的两个常见方法。

  1. Promise.all:
    • 使用场景:当你有多个 Promise 需要同时执行,并且你想等待它们全部完成后再执行下一步操作时,可以使用 Promise.all
    • 行为:Promise.all 接收一个 Promise 数组作为参数,并返回一个新的 Promise 对象。该新 Promise 对象在所有传入的 Promise 对象都成功完成时才会被标记为成功,其结果是一个包含所有 Promise 结果的数组;如果任何一个 Promise 被拒绝(rejected),则返回的 Promise 会立即被拒绝,并且会带有第一个被拒绝的 Promise 的原因。
const promises = [promise1, promise2, promise3];
Promise.all(promises).then(results => {// 所有 promise 都成功,results 是一个包含所有 promise 结果的数组}).catch(error => {// 任何一个 promise 被拒绝时执行});
  1. Promise.race:
    • 使用场景:当你想在多个 Promise 中的任何一个完成时执行某个操作时,可以使用 Promise.race
    • 行为:Promise.race 也接收一个 Promise 数组作为参数,并返回一个新的 Promise 对象。该新 Promise 对象会在数组中的任何一个 Promise 被解决(resolved)时被解决,并且结果与第一个完成的 Promise 的结果相同,无论是成功还是失败。
const promises = [promise1, promise2, promise3];
Promise.race(promises).then(result => {// 第一个完成的 promise 成功或失败时执行}).catch(error => {// 第一个完成的 promise 失败时执行});

总的来说,Promise.all 用于等待多个 Promise 都完成,而 Promise.race 则用于等待多个 Promise 中的第一个完成。

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

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

相关文章

Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV

OpenCV是大型的Third party 计算机视觉库,在开发中会经常用到,本篇记录一下 在Ubuntu系统上安装和配置OpenCV,并使用C/C调用OpenCV 关于VS Code配置C/C开发环境的部分,见之前的博文 Linux/Ubuntu系统下使用VS Code配置C/C开发环境…

shell进阶之计算编译前后时间(十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

代码+视频,R言语处理数据中的缺失值

在SCI论文中,我们不可避免和缺失数据打交道,特别是在回顾性研究,对于缺失的协变量(就是混杂因素),我们可以使用插补补齐数据,但是对于结局变量和原因变量的缺失,我们不能这么做。部分…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

数据分析思维——数据埋点笔记,以电商为例

数据埋点 数据分析前提是有数据,数据从哪里来,要选择采集哪些数据都需要考虑。如某些app上的商品推荐,是基于哪些信息来预判的呢?因此作为数据分析师有必要系统的了解用户行为到用户数据的整个过程 何为数据埋点 每当用户在客户端…

【GlobalMapper精品教程】079:投影坐标系转地理坐标系(UTM转WGS1984/2000)

文章目录 一、矢量UTM转WGS1984/20001. UTM转WGS19842. UTM转CGCS2000二、栅格UTM转WGS1984/2000一、矢量UTM转WGS1984/2000 加载配套实验数据(data079.rar)中的矢量数据,如下所示: 查看源坐标系:双击图层的,图层投影选项卡,为UTM投影,Zone48N。 设置系统坐标系:点击…

C#【进阶】泛型

1、泛型 文章目录 1、泛型1、泛型是什么2、泛型分类3、泛型类和接口4、泛型方法5、泛型的作用思考 泛型方法判断类型 2、泛型约束1、什么是泛型2、各泛型约束3、约束的组合使用4、多个泛型有约束思考1 泛型实现单例模式思考2 ArrayList泛型实现增删查改 1、泛型是什么 泛型实现…

nowcoder——回文结构

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 我们来分析该题:我们首先要清楚什么是回文结构?其实就是对称结构。如果一个链表呈对称结构就说明该链表具有回文结构。 下面给上一些例子: 那我们怎么判断该链表是否属于回文结构呢&#xf…

Python彻底解决TypeError的问题

今天看到一个问题: TypeError: int() argument must be a string, a bytes-like object or a number, not list 代码是这样的: id int(os.path.split(imagePath)[1].split(.)[0]) 其实这个提示已经非常明显了,百度翻译过来就是&#xff1a…

[BJDCTF2020]ZJCTF,不过如此 1

涉及&#xff1a;php的伪协议、preg_replace函数的漏洞和正则表达式的运用。 解题步骤 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream"))…

zookeeper安装集群模式

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 ZooKeeper是一个分…

梦幻西游全新变现,蓝海热门玩法,小白一部手机可操作,日入2000+

亲爱的朋友们&#xff0c;你们好&#xff01;今天我要给大家分享一个热门、可行的网络赚钱项目——梦幻西游全新变现&#xff0c;蓝海热门玩法&#xff0c;小白一部手机可操作&#xff0c;日入2000。 这个项目不需要花冤枉钱&#xff0c;也是我自己实操过的&#xff0c;非常可…

法语语式与时态总结,柯桥零基础学法语

常用语式 法语中的常用语式分为&#xff1a;直陈式、条件式、虚拟式、命令式、不定式与分词式。 直陈式&#xff08;lindicatif&#xff09;初学法语时首先就要学直陈式&#xff0c;也是最常用的语式&#xff0c;表示确实发生的动作。 条件式&#xff08;le conditionnel&am…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

day06-07面向对象(高级)

面向对象(高级) 知识回顾: 1.面向对象基础 类的定义 对象的使用 private关键字 this关键字 封装 构造方法 JavaBean2.API 的使用 知识回顾 Scanner Random String Date1.继承 查看下述代码: 发现有什么问题&#xff1f; 你所抽取的代码没有了&#xff0c;怎么办&#xff1f…

【Qt-CMake】QT中cmak编译出现CMake Error: The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的&#xff0c;编写代码时发现无论怎样修改代码&#xff0c;运行后都没有任何变化&#xff0c;以为是qtbug&#xff0c;重构重启都没用&#xff0c;最后…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件&#xff1a; 例如&#xff1a;将home.ui文件转为vio_detect.py文件&#xff0c;所需命令如下&#xff1a; pyuic5 -x home.ui -o vio_detect.py

XXE-lab靶场搭建

源码下载地址 https://github.com/c0ny1/xxe-lab1.php_xxe 直接放在php web页面下即可运行。 2.java_xxe java_xxe是serlvet项目&#xff0c;直接导入eclipse当中即可部署运行。 3.python_xxe: 安装好Flask模块python xxe.py 4.Csharp_xxe 直接导入VS中运行 phpstudy…

内存操作数及寻址方式

debug命令 debug命令&#xff0c;即DOS实用程序。DEBUG是一个DOS实用程序&#xff0c;是供程序员使用的程序调试工具&#xff0c;可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性&#xff0c;也可以追踪执行过程…

编程代码的舞者--Python循环语句

循环语句是编程中不可或缺的要素之一&#xff0c;它们能够让程序反复执行特定的任务&#xff0c;提高代码的重复利用性和效率。在本篇博客中&#xff0c;我们将深入探讨Python中常用的循环语句&#xff0c;包括for循环和while循环&#xff0c;以及控制循环流程的关键字break和c…