如何测试流是否已结束?

时间:2015-08-27 22:20:22

标签: node.js node.js-stream

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

3 个答案:

答案 0 :(得分:4)

如果你绝对必须,你可以检查stream._readableState.ended,至少在节点0.10和0.12中。这不是公共API,但要小心。显然,所有流也不保证也有这个属性:

值得一读:

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

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

答案 1 :(得分:2)

您可能不应该检查,而是附加end事件侦听器。当流结束时,您将收到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);
})();

答案 2 :(得分:2)

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

(可写流具有corresponding property