Javascript 承诺中的内存泄漏

Javascript 承诺中的内存泄漏,javascript,es6-promise,Javascript,Es6 Promise,我正在尝试实现一个函数,它利用先等待然后记录一些字符串的承诺,首先想到的是clearTimeout,当考虑setTimeout时,函数会执行我想要的操作。我的问题是,在创建的初始承诺中是否存在内存泄漏,自从我清除timeId后,该承诺一直处于挂起状态,因此它永远不会得到解决 对不起,我的英语不好,代码混乱 // Goodman function Goodman(sbd) { let timeId let promise = new Promise(resolve => {

我正在尝试实现一个函数,它利用先等待然后记录一些字符串的承诺,首先想到的是clearTimeout,当考虑setTimeout时,函数会执行我想要的操作。我的问题是,在创建的初始承诺中是否存在内存泄漏,自从我清除timeId后,该承诺一直处于挂起状态,因此它永远不会得到解决

对不起,我的英语不好,代码混乱

// Goodman
function Goodman(sbd) {
  let timeId

  let promise = new Promise(resolve => {
    timeId = setTimeout(() => resolve(console.log('I am ' + sbd)), 0)
  })

  let rest = function(ms) {
    this.promise.then(() => new Promise(resolve => setTimeout(resolve, ms)))
    return this
  }

  let learn = function(sth) {
    this.promise.then(() => console.log('Learning ' + sth))
    return this
  }

  let restFirst = function(ms) {
    clearTimeout(this.timeId)
    this.promise = new Promise(resolve => {
      this.timeId = setTimeout(resolve, ms)
    }).then(() => console.log('I am ' + sbd))
    return this
  }

  return {
    timeId,
    promise,
    rest,
    learn,
    restFirst
  }
}

// Initially wait 5 seconds
// "I am Tom"
// "Learning chinese"
Goodman('Tom')
  .restFirst(5000)
  .learn('chinese')
我的问题是,在创建的初始承诺中是否存在内存泄漏,自从我清除timeId后,该承诺一直处于挂起状态,因此它永远不会得到解决

不,一个永远不会被解析或拒绝的承诺和其他任何对象一样,只是Javascript中的一个对象。当对象变得不可访问时,当不再有任何代码引用该对象时,它将被垃圾收集


记住,承诺只是一个通知系统。它们只是一个普通的Javascript对象,充当成功和失败监听器的清算所,并为将来某个时间完成的某个事件锁定成功值或失败原因。它们只是一个对象,其方法与其他任何对象一样。当它们变得不可访问时,无论它们是已解决的、被拒绝的还是尚未解决的,它们都将在那时被垃圾收集。

只是吹毛求疵,但可能需要注意的是,对其执行者的引用也会使承诺不被GCD。@Kaido-是的,这是真的,但那是因为解决并拒绝对执行者的论点,有对承诺对象的引用,只要执行者还活着,就可以访问该对象。所以,当对象不再可访问时,它将被垃圾收集,这与整个规则是一样的。在OP的例子中,一旦调用clearTimeout,执行器就不再存在。是的,当然,正如我说的,这只是一个吹毛求疵的问题,有些人可能认为只要他们的代码不包含任何对Promise对象的引用,他们就可以继续执行,而没有考虑到内部确实存在各种符合实际承诺的东西。事实上,它根本不适用于OP的情况。仅供参考,timeId被声明并分配为局部变量,然后稍后您将尝试访问此.timeId。这些不一样。