Javascript 完成的承诺是否进一步向上获得GC';D
如果您在长时间运行的流程中向承诺链添加承诺,如下所示:Javascript 完成的承诺是否进一步向上获得GC';D,javascript,promise,garbage-collection,Javascript,Promise,Garbage Collection,如果您在长时间运行的流程中向承诺链添加承诺,如下所示: let q = Promise.resolve(); let i = setInterval(() => { q = q.then(() => { return new Promise((resolve) => { setTimeout(() => { console.log("one resolved");
let q = Promise.resolve();
let i = setInterval(() => {
q = q.then(() => {
return new Promise((resolve) => {
setTimeout(() => {
console.log("one resolved");
resolve();
}, 1)
});
});
}, 2);
链中已完成的承诺会被垃圾回收,还是会泄漏内存
在长时间运行的应用程序中,通过将链变量(q)重新分配给q=(q+nextPromise)
添加到链中是否安全?有没有更好的方法来创建基于承诺的队列
从这个例子来看,它看起来像是GC'd,但这仅仅超过30秒?承诺与任何其他对象没有区别;一旦没有更多的引用,它们将被GC删除 在解析承诺之前,其
resolve
回调是一个引用(如果该引用丢失,则无法解析该承诺,并且可能会被GC删除)
链中已完成的承诺是否会被垃圾回收
是的,它们没有被任何东西引用——既不是一个未完成的异步任务(通过resolve
回调),也不是全局q
变量。您可以在调试器屏幕截图中看到它们正在被收集
由then
创建的承诺不引用链接回调的承诺。只有回调(存储在它所附加的承诺中,甚至可能仅通过解析器弱引用)引用了新承诺的解析能力。一旦解决了,就没有任何参考保留
在长时间运行的应用程序中,通过将链变量q
重新分配给q+nextPromise
添加到链中是否安全
是的,这是一个很好的模式。只需确保新链链接的排队速度不会超过解析它们的速度:-)在您的示例中没有长链。所有回调都被添加到同一个
q
promise。如果你想创建一个长链,那么你应该执行q=q。然后(…)
,然后你的问题就更有意义了。@Bergi谢谢这是我想发布的,更新的代码这并不能真正回答问题。现在的问题是,当它是这个链条的一部分时,它是否能够获得GCD,而目前的承诺早已实现,但其他人却被它链成了一条长长的链条。所以,我们都需要知道的是,什么时候它在一个链中,什么时候从链中的后代对它的引用被清除,以使它符合GC的条件。这才是真正的问题。