Promise的静态方法有哪些,分别怎么使用?

来源:个人站长作者:盲改大师头衔:程序员
导读:本期聚焦于小伙伴创作的《Promise的静态方法有哪些,分别怎么使用?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Promise的静态方法有哪些,分别怎么使用?》有用,将其分享出去将是对创作者最好的鼓励。

Promise的静态方法是挂载在Promise构造函数上的方法,不需要创建Promise实例就可以直接调用,这些方法在处理多异步任务协作、异步结果转换等场景中非常实用,下面先介绍常用的几个静态方法。

Promise的静态方法有哪些,分别怎么使用?

Promise.resolve

Promise.resolve方法用于将一个值快速转换为一个状态为 fulfilled 的Promise对象,它的参数如果是Promise实例则会直接返回该实例,如果是thenable对象(包含then方法的对象)则会跟随该对象的执行状态,其他普通值则会作为fulfilled状态的返回值。

// 传入普通值
const p1 = Promise.resolve(123);
p1.then(res => {
  console.log(res); // 输出123
});

// 传入Promise实例
const p2 = new Promise(resolve => resolve('test'));
const p3 = Promise.resolve(p2);
console.log(p1 === p2); // 输出false
console.log(p3 === p2); // 输出true

// 传入thenable对象
const thenable = {
  then(resolve) {
    resolve('thenable result');
  }
};
Promise.resolve(thenable).then(res => {
  console.log(res); // 输出thenable result
});

Promise.reject

Promise.reject方法用于创建一个状态为 rejected 的Promise对象,无论传入什么参数,都会直接作为拒绝的原因,不会像Promise.resolve那样对参数做特殊处理。

const p = Promise.reject(new Error('请求失败'));
p.catch(err => {
  console.log(err.message); // 输出请求失败
});

// 传入thenable对象也会直接作为拒绝原因
const thenable = {
  then() {}
};
Promise.reject(thenable).catch(err => {
  console.log(err === thenable); // 输出true
});

Promise.all

Promise.all接收一个可迭代对象(通常是Promise数组),当所有Promise都变为fulfilled状态时,返回的Promise才会变为fulfilled,结果是一个包含所有Promise返回值的数组,顺序和传入的Promise顺序一致。如果其中有一个Promise变为rejected状态,返回的Promise会立即变为rejected,拒绝原因是第一个被拒绝的Promise的原因。

const p1 = Promise.resolve(1);
const p2 = new Promise(resolve => setTimeout(() => resolve(2), 1000));
const p3 = Promise.resolve(3);

Promise.all([p1, p2, p3]).then(res => {
  console.log(res); // 等待1秒后输出[1,2,3]
}).catch(err => {
  console.log(err);
});

// 有一个rejected的情况
const p4 = Promise.reject('错误');
Promise.all([p1, p4, p3]).catch(err => {
  console.log(err); // 输出错误
});

使用注意事项

  • 如果传入的可迭代对象为空数组,Promise.all会立即返回一个fulfilled状态的Promise,结果为空数组
  • 如果传入的数组中不是Promise对象,会被自动转换为Promise对象再处理

Promise.allSettled

Promise.allSettled同样接收一个可迭代的Promise集合,它会等待所有Promise都完成(不管是fulfilled还是rejected),然后返回一个Promise,结果是一个数组,每个元素对应每个Promise的结果,包含status字段表示状态,如果是fulfilled则有value字段,如果是rejected则有reason字段。

const p1 = Promise.resolve(1);
const p2 = Promise.reject('错误');
const p3 = new Promise(resolve => setTimeout(() => resolve(3), 500));

Promise.allSettled([p1, p2, p3]).then(res => {
  console.log(res);
  // 输出:
  // [
  //   { status: 'fulfilled', value: 1 },
  //   { status: 'rejected', reason: '错误' },
  //   { status: 'fulfilled', value: 3 }
  // ]
});

和Promise.all的区别是,它不会因为某个Promise被拒绝就提前结束,适合需要获取所有异步任务最终结果的场景,比如批量上传文件,不管单个文件是否上传成功都需要知道所有文件的上传结果。

Promise.race

Promise.race接收一个可迭代的Promise集合,返回的Promise会跟随第一个完成(不管是fulfilled还是rejected)的Promise的状态和结果,也就是谁先改变状态就用谁的结果。

const p1 = new Promise(resolve => setTimeout(() => resolve('p1完成'), 1000));
const p2 = new Promise(resolve => setTimeout(() => resolve('p2完成'), 500));
const p3 = Promise.reject('p3失败');

// p2先完成
Promise.race([p1, p2]).then(res => {
  console.log(res); // 输出p2完成
});

// p3先被拒绝
Promise.race([p1, p3]).catch(err => {
  console.log(err); // 输出p3失败
});

常见使用场景是给异步请求设置超时时间,比如下面是一个请求超时处理的示例:

function requestWithTimeout(url, timeout) {
  const requestPromise = fetch(url);
  const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => reject('请求超时'), timeout);
  });
  return Promise.race([requestPromise, timeoutPromise]);
}

// 假设请求地址,实际使用时替换成真实地址
requestWithTimeout('https://ipipp.com/api/test', 2000)
  .then(res => res.json())
  .catch(err => console.log(err));

Promise.any

Promise.any接收一个可迭代的Promise集合,当其中有一个Promise变为fulfilled状态时,返回的Promise就会变为fulfilled,结果就是第一个fulfilled的Promise的返回值。如果所有Promise都变为rejected状态,返回的Promise会变为rejected,拒绝原因是一个AggregateError对象,包含所有拒绝的原因。

const p1 = Promise.reject('错误1');
const p2 = new Promise(resolve => setTimeout(() => resolve('p2成功'), 500));
const p3 = Promise.reject('错误2');

Promise.any([p1, p2, p3]).then(res => {
  console.log(res); // 输出p2成功
}).catch(err => {
  console.log(err.errors); // 输出所有拒绝原因
});

// 所有都拒绝的情况
Promise.any([p1, p3]).catch(err => {
  console.log(err instanceof AggregateError); // 输出true
  console.log(err.errors); // 输出['错误1', '错误2']
});

和Promise.race的区别是,Promise.any只关心是否有成功的Promise,只要有一个成功就不会进入rejected状态,而Promise.race只要有一个先改变状态(不管成功还是失败)就会跟随那个状态。

方法对比总结

下面是几个常用静态方法的核心特性对比:

方法名等待规则返回值规则适用场景
Promise.all等待所有fulfilled,有一个rejected就立即结束fulfilled时返回所有结果的数组,rejected时返回第一个拒绝原因多个异步任务相互依赖,需要全部成功才能继续的场景
Promise.allSettled等待所有任务完成(不管成功失败)返回所有任务的状态和结果集合需要获取所有异步任务最终结果的场景
Promise.race等待第一个状态改变的任务跟随第一个改变状态的任务的结果请求超时、竞态请求等场景
Promise.any等待第一个fulfilled的任务fulfilled时返回第一个成功结果,全部失败返回AggregateError多个备用请求,只要有一个成功即可的场景

在实际开发中,我们可以根据具体的异步任务协作需求,选择合适的Promise静态方法,减少不必要的异步逻辑代码,让异步流程更清晰易维护。如果使用Promise.all时需要处理单个任务失败不影响整体的情况,可以提前给每个Promise添加catch处理,避免整个Promise.all被拒绝。

PromiseJavaScript异步编程静态方法修改时间:2026-06-29 13:39:56

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。