Node.js 如何测试流是否已结束?

Node.js 如何测试流是否已结束?,node.js,node.js-stream,Node.js,Node.js Stream,我有一条小溪,可能已经结束,也可能还没有结束。如果它已经结束,我不想永远坐在那里等待end事件。如何检查?您可能不应该检查,而是附加一个end事件侦听器。当流结束时,您将获得一个end事件 如果[readable]流实现正确,则在没有剩余内容可读取时,您将获得一个end事件。对于没有结束的开放式流,您可以实现一个活动计时器,以查看流上次可读的时间,并在一定时间后决定删除侦听器 (function() { var timeout = null; var WAIT_TIME = 10

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

您可能不应该检查,而是附加一个
end
事件侦听器。当流结束时,您将获得一个
end
事件

如果[readable]流实现正确,则在没有剩余内容可读取时,您将获得一个end事件。对于没有结束的开放式流,您可以实现一个活动计时器,以查看流上次可读的时间,并在一定时间后决定删除侦听器

(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);
})();

如果必须这样做,您可以至少在节点0.10和0.12中检查
stream.\u readableState.end
。虽然这不是公共API,但要小心。显然,所有流也不能保证具有此属性:

值得一读的是:


从节点12.9.0开始,可读流具有可检查的
readableEnded
属性–请参阅


(可写流有一个)

end
事件发生之前,我没有访问流的权限。您可以将输入流导入一个新流。可读,并将侦听器连接到包装器。然后您不必担心它是否有数据,只需附加事件处理程序来处理这两个实例。