【问题标题】:Is it possible to overwrite native Es6 promise resolve method?是否可以覆盖本机 Es6 Promise 解析方法?
【发布时间】:2016-03-13 15:15:03
【问题描述】:

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

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

【问题讨论】:

  • 你试过了吗?我的意思是如果你能够覆盖整个 Promise 对象,那么它是可能的。如果你不能,那么我想你只能更改原型 Promise 对象而不是基本 Promise 对象本身
  • 既然你用的是es6,我宁愿继续创建一个包装类
  • 你能举个例子吗?请记住,我想保留 Promise 类名。
  • 你想重写 Promise.resolve 吗?如果是这样,那真的是个坏主意。如果你想创建一个 Promise 并控制如何调用 resolve,这不仅是个好主意,而且很正常。 new Promise((resolve,reject) => { /*现在由你决定如何/如果在这里调用resolve或reject*/ })
  • 我想在每次解决后添加额外的操作

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

是的,这是可能的。你必须包装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”)。

【讨论】:

  • 您能详细说明一下吗?我认为“你的代码在这里”部分遗漏了很多。你如何想象包装wrappedResolvewrappedRejectwrappedSuccessHandlerwrappedRejectHandler
猜你喜欢
  • 2023-03-16
  • 2021-05-24
  • 2017-06-18
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多