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 中的第一个完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】————类与对象(上)-基础知识

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 类的两种定义方式: 成员变量命名规则的建议: 4.类的访问限定符及封装 4.1 访问限定符 ​编辑 【面试题】问题:C中struct和class的区别是什么? 4.2 封装 【面试…

数据分析中大数据和云计算

大数据和云计算 前言一、大数据二、大数据定义三、数据存储单位四、大数据存储技术五、大数据应用技术六、大数据特征七、数据容量八、数据类型的多样性结构化数据半结构化数据非结构化数据 九、获取数据的速度十、可变性十一、真实性十二、复杂性十三、价值十四、云计算十五、…

小白有什么副业可以做?

对于小白来说,以下是一些适合做副业的选择 1. 网络销售 可以在电商平台上开设小店,销售自己感兴趣的产品,如手工制品、二手物品、个人设计的商品等。 2. 做任务 目前网上最流行的就是做任务,因为简单无门槛,我推荐百…

partially initialized module ‘replicate‘ has no attribute ‘run‘

partially initialized module replicate has no attribute run(most likely due to a circular import) 在包名上停留查看impot 包的地址。 报错原因: 文件重名了,导入了 当前文件 。 修改文件名 即可。

分布式版本控制工具 - Git

文章目录 1. 概念介绍2. 客户端2.1 介绍2.2 仓库操作2.3 文件操作2.4 分支原理与操作2.5 标签2.6 远程仓库2.7 README与IGNORE 3. IDEA集成4. 版本号4.1 介绍4.2 文件操作4.2 分支操作 5. 命令5.1 介绍5.2 仓库操作5.3 文件操作5.4 分支操作5.5 标签操作5.6 远程仓库 1. 概念介…

【WebGPU】WebGPU 中的反应扩散计算着色器

在本教程中,我们将使用 WebGPU 技术中的计算着色器实现图像效果。更多精彩内容尽在数字孪生平台。 程序结构 主要构建两个 WebGPU 管道: 运行反应扩散算法多次迭代的计算管道(js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识,下面我们将介绍缓冲区的相关知识。 本质上来说,缓冲区就是一块内存区域,因为内核上的缓冲区较复杂,所以本文主要介绍C语言的缓冲区。 目录 1.为什么要有缓冲区 2.应用层缓冲区的默认刷新策略 …

【C++】STL — map和set的使用详细介绍

前言 本章将继续学习STL中的两个很重要的容器map和set,其底层实现是封装了一个红黑树,我们通过本节来学习和深入了解一下这两大容器。。。 序列式容器: string 、Vector、List 、dequeue 关联式容器:MAP 、SET、nordered_map、uno…

成员函数构造函数析构函数

文章目录 类的6个默认成员函数构造函数概述定义特性 析构函数概述特性 类的6个默认成员函数 空类: 如果一个类里面什么都没有写,我们称之为空类 class Date {};空类真的什么都没有吗? 实际上并非如此,编译器会自动生成6个默认成…

【大数据】HDFS

文章目录 [toc]HDFS 1.0NameNode维护文件系统命名空间存储元数据解决NameNode单点问题 SecondaryNameNode机架感知数据完整性校验校验和数据块检测程序DataBlockScanner HDFS写流程HDFS读流程HDFS与MapReduce本地模式Block大小 HDFS 2.0NameNode HANameNode FederationHDFS Sna…

C++笔试强训day19

目录 1.小易的升级之路 2.礼物的最大价值 3.对称之美 1.小易的升级之路 链接 模拟就行&#xff0c;唯一可能是难点得就是gcd&#xff08;最大公约数&#xff09; #include <iostream> using namespace std; #define int long long const int N 1e5 10; int arr[N];…

【DIY小记】深圳万象天地餐馆探店点评

第一次在技术博客里面写生活日记&#xff0c;也算是破了个小天荒。个人以为&#xff0c;博客是个人生活思考的载体&#xff0c;而技术只占生活的一部分&#xff0c;那么博客里为什么一定要限制只能够写技术内容&#xff0c;不能写点其它生活上的东西呢&#xff1f;思来想去&…

科研诚信与学术规范 2024年春 期末考试答案

章节答案&#xff1a;https://www.bilibili.com/video/BV1JZ42177F8/ 是这个课&#xff0c;网上的大多数答案都是以前的&#xff0c;跟这门课没啥关系. 期末考试的答案长这样&#xff0c;题库有80个题&#xff0c;考试一般是50个题。 期末考试答案&#xff1a;&#xff08;不…

C++动态内存区域划分、new、delete关键字

目录 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 二、new关键字 1、内置类型的new/delete使用方法&#xff1a; 2、new和delete的本质 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 因为不同数据有不同的存储需求&#xff0…

6818Linux内核--Bootloader应用分析

Bootloader应用分析 一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a; 引导加载程序。包括固化在固件( firmware )中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。 Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 文件系统…

Polygon市值机器人

随着区块链技术的蓬勃发展和数字货币市场的日益繁荣&#xff0c;投资者们对于如何精准把握市场动态、实现资产稳健增长的需求愈发迫切。在这个背景下&#xff08;市值管理飞//机//aishutuyu&#xff09;&#xff0c;Polygon市值机器人应运而生&#xff0c;作为一款基于Polygon公…

TriCore:Interrupt

今天简单总结下 TriCore 的中断路由模块。 名词缩写 缩写全称说明IRInterrupt Router SRService Request 包括&#xff1a; 1. External Resource 2. Internal Resource 3.SW&#xff08;Software&#xff09; SPService Privoder 包括&#xff1a; 1. CPU 2. DMA SRNServic…

【5分钟学会一个知识点】01.Elasticsearch基本操作-增删改查

目录 【5分钟学会一个知识点-探索现代搜索与分析引擎的魅力】01.Elasticsearch基本操作-增删改查1.基本操作1.1索引操作1.2文档操作1.3查询1.4修改数据1.5查询1.5.1条件查询1.5.1.1遍历所有的索引1.5.1.2查询某个索引1.5.1.3条件查询1&#xff1a;使用GET url传参数1.5.1.4条件…

proteus数模转换器DAC0832的应用

proteus proteus&#xff0c;即EDA工具软件。Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能&#xff0c;还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步&#xff0c;但已受到…

油泼辣子在食品类别可以申请成商标不!

前阵韩国人在美国申请“chili crunch”油泼辣子作为商标&#xff0c;还准备禁止华人餐馆使用投诉侵权并索赔&#xff0c;普推知产老杨在USPTO上面检索发现&#xff0c;这个人申请的主要是30类方便食品的调味品&#xff0c;商标分类是全球通用的。 商标名称不能申请本类所属的通…