Почему Node.js не слушает событие постоянно? - PullRequest
0 голосов
/ 08 января 2019

Я предполагаю, что Node.js постоянно прослушивает события и асинхронно обрабатывает код слушателя при каждом событии.

Я попытался определить пользовательское событие с помощью модуля 'events', который генерируется вручную в скрипте.

var events = require('events');
var myEmitter = new events.EventEmitter();

myEmitter.on('someEvent', function(msg){
console.log(msg);
});

myEmitter.emit('someEvent', 'the event is emitted');

Когда я запускаю приведенный выше скрипт, процесс завершается после обработки события только один раз. Откуда Node.js знает, что не будет больше событий, которые могут быть запущены в будущем? Я видел, что server.listen () модуля 'http' непрерывно прослушивает входящие соединения и не завершает работу после получения первого соединения. Почему мой код не ведет себя так же?

Или, другими словами, как я могу определить события, которые являются асинхронными и прослушиваются непрерывно?

РЕДАКТИРОВАТЬ: Я также хотел бы знать, как события, которые происходят непредсказуемо (например, нажатия кнопок браузера, сервер получает соединение и т. Д.), Работают под капотом, так что программа работает непрерывно, без завершения.

1 Ответ

0 голосов
/ 08 января 2019

Мы говорим здесь о двух разных вещах. События и розетки.

В вашем случае вы говорите узлу, что когда появляется событие с именем someEvent, вы хотите обработать его. И тогда вы излучаете это событие. Когда вы это сделаете, node.js увидит, что для него есть собственный обработчик, и вызовет вашу функцию. Когда ваша функция заканчивается, в программе больше нет действий, и она завершается.

Node.js активно не ожидает таких событий, как:

while (1) {
  if (isThereANewEvent()) treatTheNewEvent();
}

Это пассивное ожидание.


С другой стороны, сокеты являются вводом-выводом, и когда вы запускаете сервер, он активно ждет. Вот почему ваша программа не завершит работу после вызова .listen

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