【问题标题】:How do I test if a stream has ended?如何测试流是否已结束?
【发布时间】:2015-11-22 11:37:44
【问题描述】:

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

【问题讨论】:

    标签: node.js node.js-stream


    【解决方案1】:

    您可能不应该检查,而是附加一个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);
    })();
    

    【讨论】:

    • end 事件触发后我才能访问流
    • 您可以将您的输入流通过管道传输到一个新的 stream.Readable 中,并将您的侦听器附加到包装器。然后你不必担心它是否有数据,你只需附加事件处理程序来处理这两个实例。
    【解决方案2】:

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

    值得一读:

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

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

    【讨论】:

      【解决方案3】:

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

      (可写流有corresponding property

      【讨论】:

        猜你喜欢
        • 2015-01-02
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 2014-02-10
        • 2012-03-17
        • 1970-01-01
        • 2017-04-21
        相关资源
        最近更新 更多