node.js – 从NodeJS中的同一个流读取的多个侦听器

我需要两个不同的监听器来读取来自可读流的输入.
他们似乎有竞争条件,我想确保我做对了……

当我使用.on(‘data’)时 – 每个侦听器都返回相同的块并可以读取它.

当我使用.on(‘可读’)时 – 第一个捕获事件的侦听器将从缓冲区读取,第二个侦听器将获得一个空缓冲区?

意思是当我有两个听众时,我不能使用.on(‘可读’)事件?

解决方法

>当发出可读事件时,两个侦听器都会侦听.但是,第一个调用read()函数获取数据,第二个将获得一个空缓冲区,因为它是相同的输入流被读取两次并且只有一个块存在.
>发出数据事件时,侦听器接收从流中读取的数据块.所以所有听众都收到相同的数据.

[编辑]详细说明它的工作原理:

所有可读流以2种模式开始:流动和暂停.默认情况下,所有可读流都以暂停模式开始,但可以使用以下三种方法中的任何一种切换到流动模式:
1.将“数据”事件处理程序附加到流
2.调用stream.resume()方法
3.调用stream.pipe()方法将数据发送到Writable.

当您使用上述任何方法时,流开始流动.它不关心数据侦听器是否附加到流并且可能丢失数据.在内部,在流上调用read()方法,并且读取内部缓冲区中正在累积的任何数据并将其发送给侦听器.内存使用率非常低.

在流上附加可读侦听器时,它优先于数据侦听器,因此您的流仍处于暂停模式.在暂停模式下,您必须通过调用read()方法显式读取内部缓冲区中的数据.当可读数据可用时,它将继续累积在内部缓冲区中,直到显式调用read()方法或恢复流.您可以指定要从内部缓冲区读取的块的大小(以字节为单位),或者返回所有可用数据.当调用read()时,数据事件也会随着读取的数据块一起发出.使用此数据后,内部缓冲区将被清空.因此,如果附加了多个可读事件并尝试使用相同的内部缓冲区,则无法多次获取相同的数据.

我给你的建议是只有一个可读的监听器和多个数据监听器.具有可读性将使您可以灵活地在需要时阅读而不会遗漏任何数据.使用数据事件处理程序,您将能够在所有处理程序中获取该数据.

相关文章

现在的js代码都是这种高级点的方式语法 , 就是ts语法 ,要使用ts语法那就要先安装一下 先安装nodejs最...
nvm是node版本管理工具 为了解决node各种版本存在不兼容现象 nvm是让你在同一台机器上安装和切换不同版...
1、安装nodejs 2、在项目文件夹目录下创建一个js文件,命名server.js(自定义名称),内容如下 3、打开命令...
1.连接路径:path.join([path1][, path2][, ...]) path.join()方法可以连接任意多个路径字符串。要连接...
简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个...
定义 Object.keys 定义:返回一个对象可枚举属性的字符串数组; Object.getOwnPropertyNames 定义:返回...