【发布时间】:2015-11-22 11:37:44
【问题描述】:
我有一个流可能已经结束,也可能还没有结束。如果它已经结束,我不想永远坐在那里等待end 事件。如何检查?
【问题讨论】:
我有一个流可能已经结束,也可能还没有结束。如果它已经结束,我不想永远坐在那里等待end 事件。如何检查?
【问题讨论】:
您可能不应该检查,而是附加一个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._readableState.ended,至少在节点 0.10 和 0.12 中。不过这不是公共 API,所以要小心。同样显然所有流也不能保证也具有此属性:
值得一读:
【讨论】:
从节点 12.9.0 开始,可读流具有您可以检查的 readableEnded 属性 - 请参阅 readable.readableEnded in the Stream documentation。
(可写流有corresponding property)
【讨论】: