【问题标题】:NodeJS stream with multiple 'data' event handler and race condition具有多个“数据”事件处理程序和竞争条件的 NodeJS 流
【发布时间】:2016-04-26 14:05:20
【问题描述】:

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

谢谢!

【问题讨论】:

标签: javascript node.js stream request koa


【解决方案1】:

Node.js 流使用EventEmitter 发送事件。任何监听事件的人(不管有多少监听器)都会收到该事件。因此,您的每个订阅者都会收到数据事件。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 2014-02-23
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多