说我有
process.stdin.setEncoding('utf8');
var myString = '';
之间有什么区别
process.stdin.on('readable', function() {
myString += process.stdin.read();
});
和
process.stdin.on('data', function(chunk) {
myString += chunk;
});
如果输入字符串在stdin结束时是相同的,那么它们会给我相同的myString
每种方法的最佳做法是什么?感谢
答案 0 :(得分:42)
它们是两个不同的API,允许您访问相同的数据块流。 {1}} API作为“Streams 2”的一部分在Node 0.10.0中引入,因此如果您搜索它,它应该有所帮助。该问题的核心是'readable'
接口允许更简单地管理和缓冲数据。
'readable'
示例用一个块调用你的函数,你别无选择,只能处理它,否则它将永远丢失。在'data'
示例中,该函数告诉您数据可用,但您可以随时阅读。这允许底层系统知道您是否已处理数据,因此支持名为 backpressure 的概念非常简单。
例如,在网络流中,如果客户端通过TCP连接向服务器发送数据并且服务器超级忙,它将收到'readable'
个事件,但它可以选择等待读取数据,直到它实际上有资源来处理数据。通过不读取数据,流将缓冲它,并且当缓冲区接近最大大小时,流将停止从操作系统读取数据包以避免占用太多RAM。然后操作系统将开始丢弃数据包,并且由于数据包被丢弃,发送数据的客户端将降低发送数据的速度,以减少数据包丢失。
旧版流“V1”实现在技术上支持这一点,但要做得更难。
所以基本上,如果你期待大量数据,使用“可读”或设计你的流来管道是一个非常好的主意,但如果你只是从终端读取一些数据,那么你很可能会看到零差异。