以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
123. 实现 Promise.prototype.finally()
实现 Promise.prototype.finally() 可以通过在 Promise 原型上添加一个方法来实现。该方法接收一个回调函数作为参数,并在 Promise 结束时执行该回调函数。
具体实现可以参考以下代码:
Promise.prototype.finally = function (callback) {
const P = this.constructor;
// 保证回调函数一定会执行
return this.then(
// 在 Promise 结束后执行回调函数
(value) => P.resolve(callback()).then(() => value),
(reason) =>
P.resolve(callback()).then(() => {
// 捕获异常并返回原因
throw reason;
})
);
};
该实现中,我们先定义一个新的 Promise 对象 P,用来封装回调函数的执行结果。然后通过 this.then() 调用链,在 then() 方法中执行回调函数。特别的,在第一个函数参数中,在回调函数执行完成后再执行 P.resolve() 来返回原始 Promise 对象,并传递执行结果。在第二个函数参数中,我们依然是先执行回调函数,但是在 P.resolve() 方法返回之后,我们需要将原因抛出以保持 Promise 错误的连续传播。
这样,我们就实现了 Promise.prototype.finally() 方法。