var myEvent = new EventEmitter();
myEvent.on("someEvent", messg => { console.log(messg); });
myEvent.emit("someEvent", "Hello its my first custom event");
因此,我创建了一个EventEmitter对象和自定义事件。我将名为"someEvent"
的自定义事件添加到myEvent对象,然后调用.emit
函数以查看内部箭头函数的结果。
var fs = require("fs");
var myReadStream = fs.createReadStream(__dirname + "/readme.txt", {
highWaterMark: 50
});
//data event added
myReadStream.on("data", chunk => {
console.log("new chunk received:");
console.log(chunk);
});
但是,在此流传输示例中,我没有调用.emit
函数,而是调用了该箭头函数。我猜怎么可能会在事件中内置"data"
事件?
答案 0 :(得分:0)
实际上是内置的。
一旦使用fs.createReadStream
API,就会创建一个Readable Stream并在绑定了侦听器时调用data
事件。
从文档中
每当流将大量数据的所有权交给使用者时,都会发出“数据”事件。每当通过调用read.pipe(),read.resume()或将侦听器回调附加到“数据”事件而将流切换为流模式时,都可能发生这种情况。
答案 1 :(得分:0)
在node.js中,流是EventEmitter
的子类,它发出自己的事件。因此,流本身就是一个调用.emit()
。您只要听您感兴趣的事件,流就会在适当的时候发出它们。
但是,在此流传输示例中,我没有调用.emit函数,而是调用了该箭头函数。我猜这是怎么回事,我猜“数据”事件是事件内置的?
是的,data
事件是内置事件,属于流的一部分。一旦为data
事件注册了一个侦听器,它将开始流的流动,然后每当有要读取的数据时,它将发出data
事件。这是stream.Readable
创建的fs.createReadStream()
的内置行为。
您可以在可读源code here中看到发出data
事件的位置之一。
function addChunk(stream, state, chunk, addToFront) {
if (state.flowing && state.length === 0 && !state.sync) {
state.awaitDrain = 0;
stream.emit('data', chunk);
} else {
// update the buffer info.
state.length += state.objectMode ? 1 : chunk.length;
if (addToFront)
state.buffer.unshift(chunk);
else
state.buffer.push(chunk);
if (state.needReadable)
emitReadable(stream);
}
maybeReadMore(stream, state);
}
您可以在doc here中看到stream.Readable
对象发出的所有事件。