是否可以覆盖原生 Es6 promise resolve 方法?

Is it possible to overwrite native Es6 promise resolve method?

I know that it's not the best approach to overwrite native JS API and I do it more for experiment.

我想覆盖 Promise 解析方法处理程序以在每个解析上执行一些额外的逻辑。可能吗?

是的,这是可能的。你必须包装 Promise.prototype.then 方法。

Promise.prototype.then = (oldThen=>{
    return function then(_successHandler, _rejectHandler){
        /* your logic here; 
        remember: both successHandler and rejectHandler can be non-functions */
        return oldThen.call(this, wrappedSuccessHandler, wrappedRejectHandler);
    }
})(Promise.prototype.then);

此代码无法拦截 new Promise() 调用,但还有其他解决方法:

class SubPromise extends Promise {
    constructor(executor) {
        super(function(_resolve, _reject) {
           /* your code goes here */
           return executor(wrappedResolve, wrappedReject);
        });
    }

    then(success, reject) {
        return super.then(wrappedSuccessHandler, wrappedRejectHandler);
    }
}
window.Promise = SubPromise;

它将全局 Promise 属性 替换为您的实现,因此解析为 window.Promise 的所有后续调用将 return 您的实现。

有关详细信息,请参阅规范中的 25.4.5.3 Promise.prototype.then(使用默认处理程序 "thrower" 和 "identity")。