如果您在长时间运行的流程中将promise添加到promise链中:
q = (q + nextPromise)
链中已完成的承诺是否会收集垃圾,还是会泄漏内存?
通过在长时间运行的应用程序中将链var(q)重新分配给sum
来添加到链中是否安全?有没有更好的方法来创建基于承诺的队列?
从这个例子看来它似乎是GC' d,但这只是超过30秒?
答案 0 :(得分:1)
承诺与任何其他对象没有什么不同;一旦没有更多参考文献,它们将被GC。
在承诺得到解决之前,其resolve
回调是一个引用(如果该引用丢失,则承诺无法解析,并且可能是GC)。
答案 1 :(得分:1)
链中已完成的承诺是否会收集垃圾?
是的,它们没有被任何东西引用 - 既不是一个出色的异步任务(通过resolve
回调),也不是全局q
变量。您可以在调试器屏幕截图中看到它们被收集。
由then
创建的承诺未引用回调链接的承诺。只有回调(存储在附加的承诺中,甚至可能只通过解析器可能只有弱)引用了新承诺的解析能力。一旦确定,就没有任何参考保留。
通过在长时间运行的应用程序中将链变量
q
重新分配给q + nextPromise
来添加到链中是否安全?
是的,这是一个非常精细的模式。只需确保您没有比解决它们更快的方式排队新的链接: - )