是否可以覆盖本机Es6 Promise解决方法?

Ste*_*rov 2 javascript ecmascript-6 es6-promise

我知道这不是覆盖本机JS API的最佳方法,我会做更多的实验。

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

Gin*_*den 5

是的,有可能。您必须包装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);
Run Code Online (Sandbox Code Playgroud)

这段代码将无法拦截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;
Run Code Online (Sandbox Code Playgroud)

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

有关更多详细信息,请参见规范中的25.4.5.3 Promise.prototype.then(默认处理程序为“ thower”和“ identity”)。

  • 您能详细说明一下吗?我认为“你的代码放在这里”部分遗漏了很多内容。您如何想象包装“wrappedResolve”、“wrappedReject”、“wrappedSuccessHandler”和“wrappedRejectHandler”? (2认同)