• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共299篇

    前端 - Javascript

关闭

返回栏目

关闭

返回前端 - Javascript栏目

140 - Promise 对象 - Promise 创建 - 静态方法创建 Promise

作者:

贺及楼

成为作者

更新日期:2025-02-21 20:05:28

Promise 对象 - Promise 创建 - 静态方法创建 Promise

在 JavaScript 异步编程的世界里,Promise 对象扮演着举足轻重的角色。它为我们处理异步操作提供了一种优雅而强大的方式,避免了回调地狱带来的困扰。除了使用 new Promise() 构造函数创建 Promise 实例之外,JavaScript 还提供了多个静态方法来创建 Promise 对象,这些静态方法各有特点,能满足不同的业务需求。下面,我们就来详细介绍这些静态方法。

1. Promise.resolve()

功能描述

Promise.resolve() 方法会返回一个已解决(resolved)状态的 Promise 对象。它可以接受不同类型的参数,根据参数的不同会有不同的处理方式:

  • 如果传入的参数是一个 Promise 对象,那么 Promise.resolve() 会原封不动地返回这个 Promise 对象。
  • 如果传入的参数是一个具有 then 方法的对象(通常称为 thenable 对象),Promise.resolve() 会将这个对象转换为一个 Promise 对象,并根据 thenable 对象的状态来决定新 Promise 对象的状态。
  • 如果传入的是其他类型的值,Promise.resolve() 会创建一个新的 Promise 对象,并将这个值作为其解决值。

示例代码

  1. // 传入普通值
  2. const resolvedPromise1 = Promise.resolve(42);
  3. resolvedPromise1.then((value) => {
  4. console.log('resolvedPromise1 的值:', value); // 输出: resolvedPromise1 的值: 42
  5. });
  6. // 传入 thenable 对象
  7. const thenable = {
  8. then: function(resolve, reject) {
  9. resolve('Hello, thenable!');
  10. }
  11. };
  12. const resolvedPromise2 = Promise.resolve(thenable);
  13. resolvedPromise2.then((value) => {
  14. console.log('resolvedPromise2 的值:', value); // 输出: resolvedPromise2 的值: Hello, thenable!
  15. });
  16. // 传入 Promise 对象
  17. const originalPromise = new Promise((resolve) => {
  18. resolve('Original Promise');
  19. });
  20. const resolvedPromise3 = Promise.resolve(originalPromise);
  21. resolvedPromise3.then((value) => {
  22. console.log('resolvedPromise3 的值:', value); // 输出: resolvedPromise3 的值: Original Promise
  23. });

2. Promise.reject()

功能描述

Promise.reject() 方法会返回一个已拒绝(rejected)状态的 Promise 对象,其拒绝原因就是传入的参数。与 Promise.resolve() 不同,无论传入的参数是什么类型,Promise.reject() 都会直接将其作为拒绝原因,不会进行额外的处理。

示例代码

  1. const rejectedPromise = Promise.reject(new Error('这是一个拒绝原因'));
  2. rejectedPromise.catch((error) => {
  3. console.log('拒绝原因:', error.message); // 输出: 拒绝原因: 这是一个拒绝原因
  4. });

3. Promise.all()

功能描述

Promise.all() 方法接收一个可迭代对象(通常是数组)作为参数,该可迭代对象中的每个元素都是一个 Promise 对象。它会返回一个新的 Promise 对象,这个新的 Promise 对象的状态取决于传入的所有 Promise 对象的状态:

  • 只有当所有传入的 Promise 对象都成功解决时,新的 Promise 对象才会成功解决,其解决值是一个数组,数组中的元素按照传入的 Promise 对象的顺序排列,分别是每个 Promise 对象的解决值。
  • 只要有一个传入的 Promise 对象被拒绝,新的 Promise 对象就会立即被拒绝,其拒绝原因就是第一个被拒绝的 Promise 对象的拒绝原因。

示例代码

  1. const promise1 = Promise.resolve(1);
  2. const promise2 = Promise.resolve(2);
  3. const promise3 = Promise.resolve(3);
  4. Promise.all([promise1, promise2, promise3]).then((values) => {
  5. console.log('Promise.all 的解决值:', values); // 输出: Promise.all 的解决值: [1, 2, 3]
  6. });
  7. const promise4 = Promise.resolve(4);
  8. const promise5 = Promise.reject(new Error('Promise 5 被拒绝'));
  9. const promise6 = Promise.resolve(6);
  10. Promise.all([promise4, promise5, promise6]).catch((error) => {
  11. console.log('Promise.all 的拒绝原因:', error.message); // 输出: Promise.all 的拒绝原因: Promise 5 被拒绝
  12. });

4. Promise.race()

功能描述

Promise.race() 方法同样接收一个可迭代对象(通常是数组)作为参数,该可迭代对象中的每个元素都是一个 Promise 对象。它会返回一个新的 Promise 对象,这个新的 Promise 对象的状态取决于传入的 Promise 对象中最先改变状态的那个:

  • 如果最先改变状态的 Promise 对象是成功解决的,那么新的 Promise 对象也会成功解决,其解决值就是最先解决的 Promise 对象的解决值。
  • 如果最先改变状态的 Promise 对象是被拒绝的,那么新的 Promise 对象也会被拒绝,其拒绝原因就是最先被拒绝的 Promise 对象的拒绝原因。

示例代码

  1. const promise7 = new Promise((resolve) => {
  2. setTimeout(() => {
  3. resolve('Promise 7 解决');
  4. }, 1000);
  5. });
  6. const promise8 = new Promise((resolve) => {
  7. setTimeout(() => {
  8. resolve('Promise 8 解决');
  9. }, 500);
  10. });
  11. Promise.race([promise7, promise8]).then((value) => {
  12. console.log('Promise.race 的解决值:', value); // 输出: Promise.race 的解决值: Promise 8 解决
  13. });
  14. const promise9 = new Promise((reject) => {
  15. setTimeout(() => {
  16. reject(new Error('Promise 9 被拒绝'));
  17. }, 300);
  18. });
  19. const promise10 = new Promise((resolve) => {
  20. setTimeout(() => {
  21. resolve('Promise 10 解决');
  22. }, 600);
  23. });
  24. Promise.race([promise9, promise10]).catch((error) => {
  25. console.log('Promise.race 的拒绝原因:', error.message); // 输出: Promise.race 的拒绝原因: Promise 9 被拒绝
  26. });

5. Promise.allSettled()

功能描述

Promise.allSettled() 方法接收一个可迭代对象(通常是数组)作为参数,该可迭代对象中的每个元素都是一个 Promise 对象。它会返回一个新的 Promise 对象,这个新的 Promise 对象会在所有传入的 Promise 对象都完成(无论是解决还是拒绝)后才会解决,其解决值是一个数组,数组中的每个元素都是一个对象,描述了每个传入的 Promise 对象的最终状态,对象包含两个属性:

  • status:值为 'fulfilled''rejected',表示 Promise 对象的最终状态。
  • valuereason:如果 status'fulfilled',则 value 属性包含 Promise 对象的解决值;如果 status'rejected',则 reason 属性包含 Promise 对象的拒绝原因。

示例代码

  1. const promise11 = Promise.resolve('Promise 11 解决');
  2. const promise12 = Promise.reject(new Error('Promise 12 被拒绝'));
  3. Promise.allSettled([promise11, promise12]).then((results) => {
  4. console.log('Promise.allSettled 的解决值:', results);
  5. /* 输出:
  6. [
  7. { status: 'fulfilled', value: 'Promise 11 解决' },
  8. { status: 'rejected', reason: Error: Promise 12 被拒绝 }
  9. ]
  10. */
  11. });

总结

静态方法 功能 特点
Promise.resolve() 返回一个已解决状态的 Promise 对象 根据传入参数类型不同有不同处理方式
Promise.reject() 返回一个已拒绝状态的 Promise 对象 直接将传入参数作为拒绝原因
Promise.all() 所有传入的 Promise 对象都成功解决时,新 Promise 对象才成功解决;有一个被拒绝则新 Promise 对象立即被拒绝 解决值是包含所有 Promise 对象解决值的数组
Promise.race() Promise 对象的状态取决于传入的 Promise 对象中最先改变状态的那个 最先改变状态的 Promise 对象决定新 Promise 对象的状态
Promise.allSettled() 所有传入的 Promise 对象都完成后,新 Promise 对象才解决 解决值是包含每个 Promise 对象最终状态信息的数组

通过这些静态方法,我们可以更加灵活地处理多个异步操作,根据不同的业务场景选择合适的方法,让异步编程变得更加简洁和高效。希望大家在实际开发中能够熟练运用这些方法,提升代码的质量和可维护性。