В node.js поток является подклассом EventEmitter
и он генерирует свои собственные события.Итак, сам поток - это один вызов .emit()
.Вы просто слушаете события, которые вас интересуют, и поток будет генерировать их, когда это необходимо.
Однако в этом примере потоковой передачи я не вызывал функцию .emit, но вызывается эта функция стрелки.Как это могло произойти, я думаю, что событие «data» встроено в событие?
Да, событие 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
испускает в документе здесь .