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