跳到主要内容

Promise 的 finally 怎么实现的?

参考答案:

Promise.prototype.finally 是 JavaScript 中 Promise 对象的一个方法,无论 Promise 对象最后的状态是 fulfilled 还是 rejected,finally 里的回调函数都会被执行。这对于清理资源或执行一些必须的操作非常有用,无论 Promise 的结果如何。

finally 的实现通常涉及对 Promise 链的处理,确保无论 Promise 的状态如何,都执行某些操作。在 Promise 的内部实现中,finally 通常是通过在 Promise 的解决(resolve)或拒绝(reject)路径上添加一个额外的步骤来实现的。

下面是一个简化的 finally 方法的实现示例:

Promise.prototype.finally = function (callback) {
  return this.then(
    value => Promise.resolve(callback()).then(() => value),
    reason => Promise.resolve(callback()).then(() => { throw reason })
  );
};

这个示例中,finally 方法返回一个新的 Promise,该 Promise 会在原始 Promise 完成(无论是 fulfilled 还是 rejected)后执行 callback。然后,它会根据原始 Promise 的状态来解决或拒绝新的 Promise。

这里使用了 then 方法来处理原始 Promise 的状态。如果原始 Promise 是 fulfilled,then 的第一个参数(一个函数)会被执行,并返回一个新的 Promise,该 Promise 在 callback 执行后解决,并带有原始 Promise 的值。如果原始 Promise 是 rejected,then 的第二个参数(一个函数)会被执行,并返回一个新的 Promise,该 Promise 在 callback 执行后拒绝,并带有原始 Promise 的拒绝原因。

请注意,这个示例是为了展示 finally 的基本概念而简化的。在真实的 Promise 库(如 ES6 中的原生 Promise 实现)中,finally 的实现可能会更复杂,以处理更多的边界情况和优化性能。