首页 > 解决方案 > 多个侦听器从 NodeJS 中的同一流中读取

问题描述

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

当我使用 .on('data') - 每个侦听器都返回相同的块并可以读取它。

当我使用 .on('readable') - 捕获事件的第一个侦听器将从缓冲区读取,而第二个侦听器将获得一个空缓冲区?

这意味着当我有两个听众时我不能使用 .on('readable') 事件?

标签: node.js

解决方案


  1. 当发出可读事件时,两个监听器都会监听。但是,第一个调用read()函数将获取数据,而第二个将获取一个空缓冲区,因为它是相同的输入流被读取两次并且只存在一个块。

  2. 数据事件被发出时,监听器接收到从流中读取的数据块。所以所有的监听器都会收到相同的数据。

[编辑]详细说明它是如何工作的:

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

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

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

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


推荐阅读