实现 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 拒绝警告
目录