是否可以覆盖原生 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")。
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")。