是否可以覆盖原生的Es6 promise解决方法?

时间:2016-03-13 15:15:04

标签: javascript ecmascript-6 es6-promise

  

我知道这不是覆盖原生JS API的最佳方法,而且我为实验做了更多。

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

1 个答案:

答案 0 :(得分:4)

是的,这是可能的。你必须包装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的所有后续调用都将返回您的实现。

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