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

概述

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。

示例:

javascript 复制代码
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 被拒绝:

javascript 复制代码
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() 都会立即返回第一个完成的结果。

示例:

javascript 复制代码
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 被触发:

javascript 复制代码
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 请求,哪一个先返回就用哪个结果。

相关推荐
编程猪猪侠1 分钟前
手写js轮播图效果参考
开发语言·javascript·ecmascript
Swift社区5 分钟前
Vue Router 越写越乱,如何架构设计?
前端·javascript·vue.js
白兰地空瓶6 分钟前
JavaScript 列表转树(List to Tree)详解:前端面试中如何从递归 O(n²) 优化到一次遍历 O(n)
javascript·算法·面试
思成不止于此9 分钟前
C++ STL中map与set的底层实现原理深度解析
开发语言·c++·set·map·红黑树·底层实现
大布布将军9 分钟前
⚡️ 后端工程师的护甲:TypeScript 进阶与数据建模
前端·javascript·程序人生·typescript·前端框架·node.js·改行学it
惺忪979811 分钟前
C++ 构造函数完全指南
开发语言·c++
小此方12 分钟前
Re:从零开始学C++(五)类和对象·第二篇:构造函数与析构函数
开发语言·c++
秦苒&13 分钟前
【C语言】详解数据类型和变量(二):三种操作符(算数、赋值、单目)及printf
c语言·开发语言·c++·c#
无限进步_13 分钟前
【C语言&数据结构】有效的括号:栈数据结构的经典应用
c语言·开发语言·数据结构·c++·git·github·visual studio
是喵斯特ya22 分钟前
python开发web暴力破解工具(进阶篇 包含验证码识别和token的处理)
开发语言·python·web安全