穿皮马甲的小哥哥 2025-01-21 17:44 采纳率: 66.7%
浏览 5

继承promise后构造函数会调用两次么

在学js高级程序设计时讲了promise扩展类添加通知功能,在调试时发现构造函数被调用两次,一次在new的时候,一次在p.then。不理解为什么p.then还要执行一次构造函数,希望大家帮忙解惑。

class myPromise extends Promise{
  static count = 0
  constructor(Fn){
      console.log(`被调用次数:${++myPromise.count}`)
    super((resolve, reject)=>{
      return Fn(resolve,reject);
    });
  }
}

const p = new myPromise((resolve, reject)=>{})
p.then()


控制台打印:
被调用次数:1
被调用次数:2

  • 写回答

4条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题涉及到JavaScript中的类继承以及Promise的实现细节。首先,让我们理解为什么构造函数会被调用两次。

    当你执行 new myPromise((resolve, reject) => {}) 时,这会创建一个新的 myPromise 对象,因此构造函数会被调用一次。这是正常的对象创建过程。

    接下来,当你调用 p.then() 时,并不会再次创建新的 myPromise 对象,所以并不会再次调用构造函数。但是,在Promise的实现中,.then() 方法内部可能会进行一些操作,其中之一就是确保Promise的状态(pending、resolved、rejected)被正确设置。在某些情况下,这些操作可能需要调用一些内部函数或方法,而这些函数或方法可能会间接地调用你定义的构造函数或某些初始化代码。这就是为什么你在调用 p.then() 后看到构造函数再次被调用的原因。

    具体来说,标准的Promise实现中并没有要求在 .then() 时必须重新调用构造函数。但是,如果你扩展的Promise类或其父类(在这里是标准的Promise类)在 .then() 方法中有这样的逻辑,或者你在某些特定的代码路径上触发了这种行为,那么这可能就是你看到的现象。

    要解决这个问题,你可以进一步检查你的代码以及你继承的Promise类的实现,看看是否有任何可能导致这种情况的逻辑。如果你只是想扩展Promise以添加通知功能,并且不希望构造函数被多次调用,那么你可能需要重新考虑你的实现方式,确保不会在不需要的时候触发构造函数的调用。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月21日