【JS】期约的Promise.all()和 Promise.race()区别

news2025/1/4 19:17:23

概述

Promise.all()Promise.race() 都是 JavaScript 中处理多个异步操作的 Promise 方法,但它们的行为和返回结果有所不同。

Promise.all()和Promise.race()

1. Promise.all()

Promise.all() 接受一个由多个 Promise 实例组成的可迭代对象(例如数组),并返回一个新的 Promise。当所有传入的 Promise 都成功解决时,Promise.all() 返回一个新的 Promise,该 Promise 的结果是所有输入 Promise 的结果组成的数组;如果任何一个输入的 Promise 被拒绝(即 reject),Promise.all() 会立即返回一个拒绝的 Promise,并且拒绝的原因是第一个被拒绝的 Promise 的原因。

[特点]
  • 必须等待所有 Promise 都成功,或者其中一个 Promise 被拒绝,才会返回结果。
  • 如果其中一个 Promise 被拒绝,Promise.all() 会立即返回拒绝的原因,不会继续等待其他 Promise。

示例:

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));
const promise3 = Promise.resolve(42);

Promise.all([promise1, promise2, promise3])
  .then((values) => {
    console.log(values); // [3, "foo", 42]
  })
  .catch((error) => {
    console.log(error); // 如果有一个Promise被拒绝,会进入catch
  });

如果其中一个 Promise 被拒绝:

const promise1 = Promise.resolve(3);
const promise2 = Promise.reject("Error!");

Promise.all([promise1, promise2])
  .then((values) => {
    console.log(values);
  })
  .catch((error) => {
    console.log(error); // "Error!"
  });

2. Promise.race()

Promise.race() 也是接受一个包含多个 Promise 的可迭代对象,并返回一个新的 Promise。不同的是,Promise.race() 只会返回第一个解决或第一个被拒绝的 Promise 的结果。不管其他 Promise 是否已经解决或拒绝,Promise.race() 只关注第一个完成的 Promise。

[特点]
  • 返回的是第一个解决(resolve)或第一个拒绝(reject)的 Promise 的结果。
  • 无论其他 Promise 是否解决或拒绝,Promise.race() 都会立即返回第一个完成的结果。

示例:

const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'foo'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'bar'));

Promise.race([promise1, promise2])
  .then((value) => {
    console.log(value); // "bar" (因为 promise2 先完成)
  })
  .catch((error) => {
    console.log(error);
  });

如果第一个拒绝的 Promise 被触发:

const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'foo'));
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error'));

Promise.race([promise1, promise2])
  .then((value) => {
    console.log(value);
  })
  .catch((error) => {
    console.log(error); // "error" (因为 promise2 先拒绝)
  });

区别总结:

特性Promise.all()Promise.race()
返回值当所有 Promise 成功时返回一个数组,包含所有 Promise 的结果。如果有任何一个 Promise 被拒绝,立即返回拒绝的原因。返回第一个解决或拒绝的 Promise 的结果,忽略其他 Promise 的状态。
成功时的返回所有 Promise 的结果组成一个数组。第一个完成的 Promise 的结果。
失败时的返回如果任何一个 Promise 被拒绝,返回拒绝的原因。第一个被拒绝的 Promise 的拒绝原因。
适用场景需要所有 Promise 完成后才能继续处理。只关心第一个完成的 Promise,不关心其余 Promise。

应用场景

  • Promise.all() 适用于当多个异步任务必须都成功完成后才能继续处理后续操作的情况。例如,加载多个资源(如图片、脚本文件等)并在所有资源加载完成后再显示页面。

  • Promise.race() 适用于当多个异步任务中只关心哪个任务最先完成的情况。例如,网络请求超时处理,或者多个可能的 API 请求,哪一个先返回就用哪个结果。

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

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

相关文章

Visual Studio 2022安装教程

1、下载网址 Visual Studio 2022 IDE安装网址借助 Visual Studio 设计,具有自动完成、构建、调试、测试功能的代码将与 Git 管理和云部署融为一体。https://visualstudio.microsoft.com/zh-hans/vs/ 点击图片所示 双击运行 2、安装 点击C桌面开发(右边…

Mono里运行C#脚本21—mono_image_init_name_cache

前面分析了怎么样加载mscorlib.dll文件,然后把文件数据读取到内存。 接着下来,就会遇到加载整个C#的类型系统,比如System. Object,大体类型如下图所示: 在对CIL编译之前,需要把这些类型全部加载到内存里,以便快捷地访问它们。 mono_image_init_name_cache函数就是完成…

C/C++编程安全标准GJB-8114解读——分支控制类

软件测试实验室在建立软件测试体系或申请cnas/cma相关资质时,需要依据相关技术标准选择合适的测试方法,并明确在测试作业指导书中,指导后续软件测试工作的开展。GJB-8114是一部嵌入式软件安全测试相关的国家标准,本系列文章我们就…

国产文本编辑器EverEdit - 批量转码转换行符

1 批量转码&转换行符 1.1 应用场景 如果用户批量在Windows编辑文件,要上传到异构系统,如:Linux,则需要批量转换编码和换行符,此时可以使用EverEdit的批量转码功能。 1.2 使用方法 选择主菜单文档 -> 批量转码…

期权懂|期权都有哪些存在的风险因素?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权都有哪些存在的风险因素? 一、市场价格波动风险 期权的价格受到多种因素的影响,包括标的资产价格、市场利率、波动率等。 这些因素的变化可能导致期…

关于AI面试系统2025年趋势评估!

在快速发展的科技浪潮中,AI技术正以前所未有的速度渗透到各行各业。企业招聘领域,作为人才选拔的关键环节,也不例外地迎来了AI面试系统的广泛应用和持续创新。2025年,AI面试系统不仅成为企业招聘的主流工具,更在智能化…

《类和对象:基础原理全解析(下篇)》

目录 一、类的构造函数的初始化列表1. 初始化列表的使用2. 初始化列表的初始化顺序3. 使用初始化列表的注意事项 二、类的自动类型转换1. 类的自动类型转换的使用2. 关闭类的自动类型转换 三、静态类成员1. 静态成员的特性2. 使用静态成员计算类创建了多少个对象3. 使用静态类成…

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…

Crosslink-NX应用连载(12):如何复用特殊功能管脚

作者:Hello,Panda 大家早上好。 昨天有朋友私信我,如何复用Crosslink-NX的特殊功能引脚如PROGRAMN、DONE、INITN诸如这些。熊猫君在这里简单介绍下: 以LIFCL-33U-8CTG104C为例,我们建立一个简单的指示灯LED周期闪烁的工程&…

go项目使用gentool生成model的gen.go问题

Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构。 使用方法: go install gorm.io/gen/tools/gentoollatest在项目根目录,执行连接的数据库中指定某几张表结构生成数据库model层 gentool -dsn "root:123456tcp(localhost:330…

家政上门小程序如何创建?家政服务怎么能少了小程序帮手

在如今这个“忙到没时间打扫”的时代,家政服务变得越来越受欢迎。为了提高效率、减少沟通成本,很多家政公司都已经开始借助小程序的力量。那么,家政上门小程序到底该如何创建呢?小程序又是如何帮助家政服务更好地满足客户需求的呢?本文将为…

破解密码

rhel8/centos8 重置 root 密码 方法 1 : rd.break 第 1 步 重启系统,在下图所示界面按 e 键 第2步 找到linux这行,末尾空格后 输入 rd.break 第3步 查看,可选步骤 这里 sysroot 是以只读的形式挂载的,所以要以可读可…

本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家

文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好!今天我要向大家展示如何将一台迷你的香橙派Z…

自学记录鸿蒙API 13:实现多目标识别Object Detection

起步:什么叫多目标识别? 无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习HarmonyOS最新的Object Detection API(API 13&#xff09…

javaEE-多线程进阶-JUC的常见类

juc:指的是java.util.concurrent包,该包中加载了一些有关的多线程有关的类。 目录 一、Callable接口 FutureTask类 参考代码: 二、ReentrantLock 可重入锁 ReentrantLock和synchronized的区别: 1.ReentantLock还有一个方法&#xff1a…

fpga系列 HDL:ModelSim显示模拟波形+十进制格式数值(临时方法和设置持久化的默认值)

模拟波形 FPGA中使用数字滤波器时,可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。右键波形->Format-> Analog 效果 数值格式显示 不同的数值格式显示:右键波形->Radix-> Decimal 效果…

Linux 中 sysctl 和 systemctl 有什么区别?

sysctl 和 systemctl 是两个不同的命令行工具,它们在 Linux 系统中分别用于不同的目的。理解这两个命令的区别对于系统管理和配置非常重要。 1. sysctl 功能 用途:sysctl 用于动态地修改内核参数,这些参数控制着操作系统的某些行为。配置文…

【ArcGISPro/GeoScenePro】检查并处理高程数据

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 数字高程模型 (DEM) 是一种栅格,可显示地面或地形的高程。 数字表面模型 (DSM) 是另一种高程栅格,可显示表面的高度,例如建筑物或树冠的顶部。 您需要准备 DEM 和 DSM 以供分析…

Redis数据库主要数据结构类型

Redis数据库提供了丰富多样的数据结构类型,以满足不同场景下的数据存储需求。以下是Redis中的主要数据结构类型: 一、五种基础数据结构 字符串(String) 简介:字符串是Redis最基本的数据类型,可以存储字符串…

基于Springboot + vue实现的校园周边美食探索及分享平台

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…