承诺中的内存泄漏

Memory leak in promise

我正在尝试利用 promise 实现一个函数,该函数先等待然后记录一些字符串,想到 setTimeout 时首先想到的是 clearTimeout,该函数做我想做的事。我的问题是,自从我清除 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')

My question is are there any memory leaks in the initial promise created which is ever pending since I clear the timeId so it's never gonna be settled.

不,从未解决或拒绝的承诺只是 Javascript 中的一个对象,就像任何其他对象一样。当不再有任何代码引用该对象时(当它变为 "unreachable" 时),它将被垃圾收集。

记住,promises 只是一个通知系统。它们只是一个常规 Javascript 对象,用作成功和失败侦听器的信息交换所,以及锁定的成功值或某些事件的失败原因,这些事件将在未来某个时间完成。它们只是一个具有方法的对象,就像任何其他对象一样。当它们变得不可访问时,无论它们是已解决、已拒绝还是仍处于待处理状态,它们都会在那时被垃圾收集。