实现 Promise.reject

手写实现 Promise.reject 静态方法,返回一个被拒绝的 Promise 对象

问题

Promise.reject() 是 Promise 的一个静态方法,用于返回一个状态为 rejected(已拒绝)的 Promise 对象。我们需要手动实现这个方法,使其能够接收一个拒绝原因,并返回一个被拒绝的 Promise 实例。

解答

/**
 * 实现 Promise.reject 静态方法
 * @param {*} reason - 拒绝的原因
 * @returns {Promise} 返回一个状态为 rejected 的 Promise 对象
 */
Promise.myReject = function(reason) {
  // 返回一个新的 Promise 实例,直接调用 reject
  return new Promise((resolve, reject) => {
    reject(reason);
  });
};

// 更简洁的实现方式(推荐)
Promise.myReject = function(reason) {
  return new Promise((_, reject) => reject(reason));
};

使用示例

// 示例 1: 基本使用
Promise.myReject('出错了')
  .then(value => {
    console.log('成功:', value);
  })
  .catch(error => {
    console.log('失败:', error); // 输出: 失败: 出错了
  });

// 示例 2: 拒绝一个 Error 对象
Promise.myReject(new Error('网络请求失败'))
  .catch(error => {
    console.log(error.message); // 输出: 网络请求失败
  });

// 示例 3: 拒绝任意类型的值
Promise.myReject({ code: 404, message: 'Not Found' })
  .catch(error => {
    console.log(error.code, error.message); // 输出: 404 Not Found
  });

// 示例 4: 与 Promise.resolve 对比
Promise.myReject('失败')
  .then(
    value => console.log('成功:', value),
    reason => console.log('拒绝:', reason) // 输出: 拒绝: 失败
  );

// 示例 5: 链式调用
Promise.myReject('初始错误')
  .catch(error => {
    console.log('第一次捕获:', error); // 输出: 第一次捕获: 初始错误
    return '已处理';
  })
  .then(value => {
    console.log('恢复正常:', value); // 输出: 恢复正常: 已处理
  });

关键点

  • 静态方法Promise.reject 是挂载在 Promise 构造函数上的静态方法,不是实例方法
  • 立即拒绝:返回的 Promise 对象会立即进入 rejected 状态,不需要异步操作
  • 接收任意值:reason 参数可以是任意类型的值(字符串、对象、Error 实例等)
  • 不会解包 Promise:与 Promise.resolve 不同,即使传入一个 Promise 对象,也不会解包,而是直接作为拒绝原因
  • 实现简单:就是创建一个新的 Promise 实例并立即调用 reject 方法
  • 错误处理:返回的 rejected Promise 需要通过 .catch().then() 的第二个参数来捕获,否则会产生未捕获的 Promise 拒绝警告