如何测试流是否已结束?

How do I test if a stream has ended?

我有一个可能已经结束也可能还没有结束的流。如果它已经结束,我不想永远坐在那里等待 end 事件。我该如何检查?

您可能不应该检查,而是附加一个 end 事件侦听器。当直播结束时,您将收到一个 end 事件。

如果 [readable] 流被正确实现,当没有任何内容可读时,您将得到一个结束事件。对于没有结束的开放式流,您可以实现一个 activity 计时器来查看自上次流可读以来已经过了多长时间,并在一定时间后决定删除您的侦听器。

(function() {
    var timeout = null;
    var WAIT_TIME = 10 * 1000; // 10 Sec
    function stopListening( ) {
        stream.off('data', listener);
    }
    function listener( data ) {
        clearTimeout(timeout);
        timeout = setTimeout(stopListening, WAIT_TIME);
        // DO STUFF
    }
    timeout = setTimeout(stopListening, WAIT_TIME);
    stream.on('data', listener);
})();

如果绝对必要,您可以检查 stream._readableState.ended,至少在节点 0.10 和 0.12 中。这不是 public API 不过要小心。同样显然所有的流都不能保证也有这个 属性:

值得一读:

https://github.com/hapijs/hapi/issues/2368

https://github.com/nodejs/node/issues/445

从节点 12.9.0 开始,可读流有一个 readableEnded 属性 您可以检查 – 参见 readable.readableEnded in the Stream documentation.

(可写流有 corresponding property