Promise.finally 实现
手写 Promise.finally 方法
问题
从零实现 Promise.prototype.finally 方法。
解答
基本实现
Promise.prototype.myFinally = function (callback) {
return this.then(
// 成功时:执行回调,然后返回原值
(value) => Promise.resolve(callback()).then(() => value),
// 失败时:执行回调,然后抛出原错误
(reason) =>
Promise.resolve(callback()).then(() => {
throw reason;
})
);
};
测试用例
// 测试成功情况
Promise.resolve(100)
.myFinally(() => {
console.log('finally 执行'); // 输出: finally 执行
})
.then((value) => {
console.log('value:', value); // 输出: value: 100
});
// 测试失败情况
Promise.reject(new Error('出错了'))
.myFinally(() => {
console.log('finally 执行'); // 输出: finally 执行
})
.catch((err) => {
console.log('error:', err.message); // 输出: error: 出错了
});
// 测试 callback 返回 Promise
Promise.resolve(200)
.myFinally(() => {
return new Promise((resolve) => {
setTimeout(() => {
console.log('异步 finally'); // 1秒后输出
resolve();
}, 1000);
});
})
.then((value) => {
console.log('value:', value); // 输出: value: 200
});
// 测试 callback 抛出错误
Promise.resolve(300)
.myFinally(() => {
throw new Error('finally 出错');
})
.catch((err) => {
console.log('caught:', err.message); // 输出: caught: finally 出错
});
关键点
finally回调不接收任何参数- 成功时返回原值,失败时抛出原错误
- 用
Promise.resolve(callback())处理回调可能返回的 Promise - 如果 callback 抛出错误或返回 rejected Promise,会覆盖原结果
目录