我知道这不是覆盖原生JS API的最佳方法,而且我为实验做了更多。
我想覆盖 Promise resolve方法处理程序,在每个解析上做一些额外的逻辑。有可能吗?
答案 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")。