具有多个“数据”事件处理程序和竞争条件的NodeJS流

时间:2016-01-20 16:09:27

标签: javascript node.js stream request koa

我想在两个独立的Koa中间件中多次(两次)使用NodeJS请求流,因此我将监听器添加到其“data”事件中。它现在有效,但是我担心它背后存在竞争条件,因为 - 基于文档 - 在添加第一个事件处理程序之后,只要有可用数据,流就会开始调用它。如果订阅之间还有其他代码,第二个事件监听器是否会收到所有块?或者是以某种方式避免(如何?)?

谢谢!

1 个答案:

答案 0 :(得分:-1)

Node.js流使用EventEmitter发送事件。任何听一个事件的人(无论有多少听众都会)都会收到这个事件。因此,您的每个订阅者都将获得数据事件。

该文档旨在警告您,通过收听“数据”事件,它会将流置于“传统”模式(或流v1)。这意味着如果由于某种原因,你的一个订阅者错过了一条消息,它就会永远消失。

但是,Node.js还支持流管道。您可以将一个可读流传输到多个输出流,并将数据发送到每个读取器(每个读取器都有一个单独的读取缓冲区)。同时,如果可读流结束,它将结束两个可写流。每个流都有自己的读缓冲区,这意味着如果它们暂时停止监听流(由于一些奇怪的原因),它们不会错过任何消息。

streamA.pipe(streamB)
streamA.pipe(streamC)