Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 完成的承诺是否进一步向上获得GC';D_Javascript_Promise_Garbage Collection - Fatal编程技术网

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的条件。这才是真正的问题。