当阅读stream.Readable
in的代码时,我很困惑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
声明只处理data
和Readable
事件,但根据API文档,该on
方法stream.readable
还接受其他活动,如close
,end
,error
。
所以我的问题是:
根据源代码,stream.Readable
除了data
和以外如何处理其他事件readable
?
您在此处看到的是该.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] 删除。
我来说两句