Promise.all()与Promise.allSettled()和Promise.race() 有什么区别与联系

Promise.all()与Promise.allSettled()和Promise.race() 有什么区别与联系

Promise.all(), Promise.allSettled(), 和 Promise.race() 都是处理多个 Promise 对象的方法,但它们各自的行为和用途有所不同。

Promise.all()

Promise.all() 方法接受一个可迭代对象(如数组)作为参数,该对象中的每个成员都是一个 Promise。它返回一个新的 Promise 实例,这个实例在所有输入的 Promise 都成功(resolved)后才解析,并且解析值是一个包含所有输入 Promise 解析值的数组。

如果输入的任何一个 Promise 失败(rejected),那么 Promise.all() 返回的 Promise 会立即失败,并且失败的原因是第一个失败的 Promise 的原因。

示例:

javascript 复制代码
const promise1 = Promise.resolve(3);
const promise2 = Promise.reject(new Error('Promise Error'));
const promise3 = Promise.resolve(7);

Promise.all([promise1, promise2, promise3])
  .then(values => console.log(values))
  .catch(error => console.error(error));
// 输出: Error: Promise Error

Promise.allSettled()

Promise.allSettled() 类似于 Promise.all(),它也接受一个包含多个 Promise 的可迭代对象。但是,即使其中的一个或多个 Promise 被拒绝,Promise.allSettled() 也会等待所有的 Promise 完成,并返回一个包含每个 Promise 的最终状态的对象数组。

每个对象都有一个 status 属性,表示 Promise 的状态("fulfilled" 或 "rejected"),以及一个 value 或 reason 属性,分别对应于 fulfilled 或 rejected 的结果。

示例:

javascript 复制代码
 const promise1 = Promise.resolve(3);
const promise2 = Promise.reject(new Error('Promise Error'));
const promise3 = Promise.resolve(7);

Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    results.forEach(result => {
      console.log(`${result.status}: ${result.value !== undefined ? result.value : result.reason}`);
    });
  });
// 输出:
// fulfilled: 3
// rejected: Error: Promise Error
// fulfilled: 7

Promise.race()

Promise.race() 接受一个可迭代对象,其中每个成员也是一个 Promise。它返回一个新的 Promise,这个 Promise 会在可迭代对象中的任何一个 Promise 解析或拒绝时立即解析或拒绝。换句话说,Promise.race() 返回的 Promise 会被第一个完成的 Promise 的结果所决定。

javascript 复制代码
const promise1 = new Promise(resolve => {
  setTimeout(() => resolve('first'), 1000);
});
const promise2 = new Promise(resolve => {
  setTimeout(() => resolve('second'), 500);
});

Promise.race([promise1, promise2]).then(value => {
  console.log(value); // 输出: 'second'
});

总结

  • Promise.all(): 所有输入的 Promise 成功后才成功,任意一个失败则立即失败
  • Promise.allSettled(): 等待所有输入的 Promise 完成,无论成功还是失败,并返回一个包含所有状态的对象数组。
  • Promise.race(): 返回第一个完成的 Promise 的结果,无论成功还是失败。
相关推荐
青岑CTF8 分钟前
攻防世界-Ics-05-胎教版wp
开发语言·安全·web安全·网络安全·php
Li emily10 分钟前
如何通过外汇API平台快速实现实时数据接入?
开发语言·python·api·fastapi·美股
xiaoqi92241 分钟前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
APIshop43 分钟前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
打小就很皮...1 小时前
Tesseract.js OCR 中文识别
前端·react.js·ocr
血小板要健康1 小时前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
qq_177767371 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
淼淼7631 小时前
安装jdk1.8
java·开发语言
2603_949462101 小时前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n1 小时前
JavaScript内存管理与执行上下文
前端·javascript