我不确定在销毁流时是否应该清理节点中流上的侦听器-似乎应该自动完成
答案 0 :(得分:0)
不,不是。如果您在节点js中销毁流,则回调仍将链接到流对象。
尝试执行此操作,然后查看控制台:
const Readable = require("stream").Readable;
const s = new Readable();
s.onClose = () => console.log;
s.onPipeEnd = () => console.log;
s.destroy();
console.log(String(s.onClose));
console.log(String(s.onPipeEnd));
答案 1 :(得分:0)
我不确定在销毁流时是否应该清理节点中流上的侦听器
您不需要清理完成的流上的侦听器。一旦流完成并且超出范围,或者您清除了对该流的任何引用,则它将有资格进行垃圾回收,因为将不再有任何代码可以到达该流对象,并且将不会有任何未完成的异步操作。可能触发更多事件的操作。
重要的是要了解,您的听众不会阻止对象被垃圾回收。因此,您无需清理它们即可使对象有资格进行垃圾收集。垃圾收集仅涉及仍可以到达对象的活动代码(计时器,异步操作或直接引用对象的代码)。
因此,在没有对流的有效引用的情况下,完成的流对象和您的侦听器将全部被垃圾回收(并因此由系统自动清除)。您无需手动清理它们。