Разве мне не нужно вызывать .emit при создании настраиваемого EventEmitter?

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" встроено в событие?

Вы не вызываете emit с fs.createReadStream(), потому что только он знает, когда он читает новые данные, и генерирует событие, чтобы вы знали. Вы просто слушаете событие.

Mark 12.09.2018 21:30

Я понял из кода, что вы сказали. Вопрос в том, что это встроенное событие "data", чтобы я мог слушать? как btn.on ("щелкнуть", ...) ?? @MarkMeyer

Gokalp Altun 12.09.2018 21:35

Да, это задокументированная часть потоков узлов: nodejs.org/api/stream.html#stream_event_data

Mark 12.09.2018 21:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
272
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

После использования 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, в док здесь.

Другие вопросы по теме