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
的实现可能会更复杂,以处理更多的边界情况和优化性能。