流被销毁时是否自动删除流侦听器
Are stream listeners automatically removed when the stream is destroyed
我不确定在销毁流时是否应该清理节点中流上的侦听器 - 似乎应该自动完成
不,不是。如果您在节点 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));
I am unsure if I should clean up a listener on a stream in node when I destroy the stream
您不需要清理已完成的流上的侦听器。一旦流完成并超出范围,或者您清除了对流的任何引用,那么它将有资格进行垃圾回收,因为将不再有任何代码可以到达该流对象,并且不会有未完成的异步可能触发更多事件的操作。
请务必了解您的侦听器不会阻止对象被垃圾回收。因此,您无需清理它们即可使对象符合垃圾回收条件。垃圾收集仅涉及仍然可以到达对象的活动代码(计时器、异步操作或直接引用您的对象的代码)。
因此,在没有对流的活动引用的情况下,完成的流对象和您的侦听器都将被垃圾收集(并因此被系统自动清除)。您不需要手动清理它们。
我不确定在销毁流时是否应该清理节点中流上的侦听器 - 似乎应该自动完成
不,不是。如果您在节点 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));
I am unsure if I should clean up a listener on a stream in node when I destroy the stream
您不需要清理已完成的流上的侦听器。一旦流完成并超出范围,或者您清除了对流的任何引用,那么它将有资格进行垃圾回收,因为将不再有任何代码可以到达该流对象,并且不会有未完成的异步可能触发更多事件的操作。
请务必了解您的侦听器不会阻止对象被垃圾回收。因此,您无需清理它们即可使对象符合垃圾回收条件。垃圾收集仅涉及仍然可以到达对象的活动代码(计时器、异步操作或直接引用您的对象的代码)。
因此,在没有对流的活动引用的情况下,完成的流对象和您的侦听器都将被垃圾收集(并因此被系统自动清除)。您不需要手动清理它们。