stream.Readable.prototype.on如何处理node.js源代码中的事件?

L.Dezhi

当阅读stream.Readablein的代码时,我很困惑Node.js

这是源代码:

https://github.com/nodejs/node/blob/master/lib/_stream_read.js#L778-L799

Readable.prototype.on = function(ev, fn) {
  const res = Stream.prototype.on.call(this, ev, fn);

  if (ev === 'data') {
    // Start flowing on next tick if stream isn't explicitly paused
    if (this._readableState.flowing !== false)
      this.resume();
  } else if (ev === 'readable') {
    const state = this._readableState;
    if (!state.endEmitted && !state.readableListening) {
      state.readableListening = state.needReadable = true;
      state.emittedReadable = false;
      if (!state.reading) {
        process.nextTick(nReadingNextTick, this);
      } else if (state.length) {
        emitReadable(this);
      }
    }
  }

  return res;
};

显然,if声明只处理dataReadable事件,但根据API文档,该on方法stream.readable还接受其他活动,如closeenderror

所以我的问题是:

根据源代码,stream.Readable除了data以外如何处理其他事件readable

jfriend00

您在此处看到的是该.on()方法的替代,因此Readable该类可以监视附加了哪些事件侦听器,并且在有人为data事件或readable事件安装侦听器时可以执行特殊的操作

此函数的第一行:

const res = Stream.prototype.on.call(this, ev, fn);

是Readable将回调和事件名称参数传递给其父级的位置,以便正常运行。AStream实现了EventEmitter接口,因此调用super方法Stream.prototype.on.call(this, ev, fn)将获得.on()预期的默认行为。

然后,在调用父项之后,它会检查某人正在监听的data事件是否为该事件或readable事件,然后在附加了这些事件侦听器之一时实现一些额外的功能。

对于data事件,它会恢复流,以便在暂停和设置为流模式时开始流。这可能是因为在Readable最初创建和配置a时,如果它在data附加事件侦听器之前开始流流,则流上的数据可能会丢失。因此,直到有人围听data事件时,它才开始流动

请注意,流上可能会发生许多over事件,这些事件都由第一行中对基类的调用处理。您在这里看到的只是Readable类在首次添加两个特定事件侦听器时想要实现的一些特殊行为此代码不影响这些事件的发送时间或侦听方式。Readable当首次连接这些事件之一的侦听器时,它只会在状态中触发一些行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章