var myEvent = new EventEmitter();
myEvent.on("someEvent", messg => { console.info(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.info("new chunk received:");
console.info(chunk);
});
Однако в этом примере потоковой передачи я не вызывал функцию .emit
, но вызывается эта стрелочная функция. Как такое могло случиться, я полагаю, что событие "data"
встроено в событие?
Я понял из кода, что вы сказали. Вопрос в том, что это встроенное событие "data", чтобы я мог слушать? как btn.on ("щелкнуть", ...) ?? @MarkMeyer
Да, это задокументированная часть потоков узлов: nodejs.org/api/stream.html#stream_event_data
Действительно, он встроен.
После использования fs.createReadStream
API создается Читаемый поток и вызывается событие data
, когда к нему привязан слушатель.
Из документов:
The 'data' event is emitted whenever the stream is relinquishing ownership of a chunk of data to a consumer. This may occur whenever the stream is switched in flowing mode by calling readable.pipe(), readable.resume(), or by attaching a listener callback to the 'data' event.
В node.js поток является подклассом EventEmitter
и генерирует свои собственные события. Итак, сам поток - это единственный вызов .emit()
. Вы просто слушаете интересующие вас события, и поток будет выдавать их, когда это необходимо.
However in this streaming example I did not call .emit function but this arrow function is called. How could that happen, I guess that "data" event is built in event?
Да, событие data
- это встроенное событие, которое является частью того, что делает поток. Как только вы регистрируете прослушиватель для события data
, он запускает поток потока, а затем, когда у него есть данные для чтения, он генерирует событие data
. Это встроенное поведение stream.Readable
, которое и создает fs.createReadStream()
.
Вы можете увидеть одно из мест, где генерируется событие 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);
}
Вы можете увидеть все события, которые создает объект stream.Readable
, в док здесь.
Вы не вызываете emit с
fs.createReadStream()
, потому что только он знает, когда он читает новые данные, и генерирует событие, чтобы вы знали. Вы просто слушаете событие.