Разве мне не нужно вызывать .emit при создании пользовательского EventEmitter? - PullRequest
0 голосов
/ 12 сентября 2018
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" встроено в событие?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

В 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 испускает в документе здесь .

0 голосов
/ 12 сентября 2018

Действительно, он встроен.

Как только вы используете API fs.createReadStream, создается Readable Stream и вызывается событие data, когда к нему привязан слушатель.

Из документов:

Событие 'data' генерируется всякий раз, когда поток передает права собственности на порцию данных потребителю. Это может происходить всякий раз, когда поток переключается в потоковый режим путем вызова readable.pipe (), readable.resume () или путем присоединения обратного вызова слушателя к событию «data».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...