Promise有哪些方法

4 阅读2分钟

Promise 提供了丰富的实例方法和静态方法来处理异步操作。以下是 Promise 的主要方法:

一、实例方法(在 Promise 对象上调用)

1. then(onFulfilled, onRejected)

promise.then(
  value => { /* 处理成功 */ },
  reason => { /* 处理失败 */ }
)
  • 注册成功和失败的回调
  • 返回一个新的 Promise,支持链式调用

2. catch(onRejected)

promise.catch(error => {
  console.error('捕获错误:', error);
})
  • 专门处理 Promise 失败的情况
  • 相当于 .then(null, onRejected)

3. finally(onFinally)

promise.finally(() => {
  console.log('无论成功失败都会执行');
})
  • 无论 Promise 成功还是失败都会执行
  • 适合做清理工作

二、静态方法(在 Promise 类上调用)

1. Promise.resolve(value)

// 创建一个已解决的 Promise
Promise.resolve('成功数据')
  .then(data => console.log(data)); // "成功数据"

// 如果参数是 Promise,则原样返回
Promise.resolve(existingPromise) === existingPromise

2. Promise.reject(reason)

// 创建一个已拒绝的 Promise
Promise.reject(new Error('失败原因'))
  .catch(error => console.error(error));

3. Promise.all(iterable)

const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);

Promise.all([p1, p2, p3])
  .then(values => {
    console.log(values); // [1, 2, 3]
  })
  .catch(error => {
    // 任何一个失败就进入这里
    console.error(error);
  });
  • 所有 Promise 都成功才成功
  • 有一个失败就立即失败(快速失败)

4. Promise.allSettled(iterable)

const p1 = Promise.resolve(1);
const p2 = Promise.reject('错误');
const p3 = Promise.resolve(3);

Promise.allSettled([p1, p2, p3])
  .then(results => {
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        console.log('成功:', result.value);
      } else {
        console.log('失败:', result.reason);
      }
    });
  });
  • 所有 Promise 都完成后返回结果
  • 无论成功失败都会等到所有完成

5. Promise.any(iterable)

const p1 = Promise.reject('错误1');
const p2 = Promise.resolve('成功2');
const p3 = Promise.resolve('成功3');

Promise.any([p1, p2, p3])
  .then(value => {
    console.log('第一个成功的:', value); // "成功2"
  })
  .catch(error => {
    // 所有 Promise 都失败时进入这里
    console.error('全部失败:', error);
  });
  • 任意一个 Promise 成功就成功
  • 所有都失败时才失败

6. Promise.race(iterable)

const fast = new Promise(resolve => 
  setTimeout(() => resolve('快'), 100)
);
const slow = new Promise(resolve => 
  setTimeout(() => resolve('慢'), 500)
);

Promise.race([fast, slow])
  .then(winner => {
    console.log('胜者:', winner); // "快"
  });
  • 第一个 完成的 Promise(无论成功失败)
  • 常用于设置超时

三、方法对比表

方法成功条件失败条件返回内容
Promise.all全部成功一个失败成功值数组
Promise.allSettled全部完成不会失败状态对象数组
Promise.any一个成功全部失败第一个成功的值
Promise.race第一个完成第一个完成第一个完成的值

四、使用示例

// 组合使用示例
const apiCall1 = fetch('/api/data1');
const apiCall2 = fetch('/api/data2');
const apiCall3 = fetch('/api/data3');

// 并行请求,全部完成后处理
Promise.allSettled([apiCall1, apiCall2, apiCall3])
  .then(results => {
    const successes = results
      .filter(r => r.status === 'fulfilled')
      .map(r => r.value);
    const failures = results
      .filter(r => r.status === 'rejected')
      .map(r => r.reason);
    
    console.log('成功:', successes.length, '失败:', failures.length);
  });

// 超时控制
function withTimeout(promise, timeout) {
  return Promise.race([
    promise,
    new Promise((_, reject) => 
      setTimeout(() => reject(new Error('超时')), timeout)
    )
  ]);
}

// 等待至少一个接口成功
Promise.any([
  fetch('/api/primary'),
  fetch('/api/backup1'),
  fetch('/api/backup2')
])
  .then(data => displayData(data))
  .catch(() => showError('所有接口都失败了'));

五、Promise 原型方法

// 这些是内部方法,通常不直接使用
Promise.prototype.then
Promise.prototype.catch
Promise.prototype.finally
Promise.prototype.constructor

Promise 的这些方法提供了灵活的组合和处理异步操作的能力,可以应对各种复杂的异步场景。