От автора: Сегодня мы поговорим о том, для чего нужны в Node js события. Node.js — однопоточное приложение, но оно может поддерживать параллелизм через концепцию событий и обратных вызовов. Каждый API-интерфейс Node.js является асинхронным и однопоточным, он использует асинхронные вызовы функций для поддержания параллелизма. Node использует шаблон проектирования Наблюдателя. Поток Node поддерживает цикл событий, и каждый раз по завершению задачи, он запускает соответствующее событие, которое сигнализирует о выполнении функции прослушивателя события.
Программирование на основе событий
В Node.js часто используются события, и это также одна из причин, по которой Node.js довольно быстр по сравнению с другими подобными технологиями. После запуска сервера Node, в нем просто инициируются собственные переменные, объявляются функции, а затем Node начинает ожидать события.
В приложении, на основе событий, обычно существует основной цикл, который прослушивает события, а затем запускает функцию обратного вызова при обнаружении одного из этих событий.
Хотя события очень похожи на обратные вызовы, разница между ними заключается в том, что функции обратного вызова вызываются, когда асинхронная функция возвращает результат, тогда как обработка событий выполняется в соответствии с шаблоном Наблюдателя. Функции, которые отслеживают события, работают как Наблюдатели. При каждом запуске события начинает выполняться его функция-прослушиватель. Node.js содержит несколько встроенных событий, доступных через модуль событий и класс EventEmitter, которые используются для привязки событий и прослушивателей событий следующим образом:
1 2 3 4 5 |
// Импорт модуля событий var events = require('events'); // Создание объекта eventEmitter var eventEmitter = new events.EventEmitter(); |
Ниже приведен синтаксис привязки обработчика события к событию:
1 2 |
// Привязка к событию обработчика события eventEmitter.on('eventName', eventHandler); |
Мы можем запустить событие программно следующим образом:
1 2 |
// Запуск события eventEmitter.emit('eventName'); |
Пример
Создайте файл js с именем main.js со следующим кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// Импорт модуля событий var events = require('events'); // Создание объекта eventEmitter var eventEmitter = new events.EventEmitter(); // Создание обработчика событий var connectHandler = function connected() { console.log('connection succesful.'); // Запуск события data_received eventEmitter.emit('data_received'); } // Привязка обработчика события к событию eventEmitter.on('connection', connectHandler); // Привязка события data_received к анонимной функции eventEmitter.on('data_received', function(){ console.log('data received succesfully.'); }); // Запуск события connection eventEmitter.emit('connection'); console.log("Program Ended."); |
Теперь попробуем запустить приведенную выше программу:
1 |
$ node main.js |
В результате мы получим следующее:
1 2 3 |
connection successful. data received successfully. Program Ended. |
Как работают приложения Node?
В приложении на Node любая асинхронная функция принимает обратный вызов в качестве последнего параметра, а функция обратного вызова принимает ошибку в качестве первого параметра. Вернемся к предыдущему примеру. Создайте текстовый файл с именем input.txt со следующим содержимым.
1 2 |
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! |
Создайте файл js с именем main.js, содержащим следующий код:
1 2 3 4 5 6 7 8 9 10 |
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err){ console.log(err.stack); return; } console.log(data.toString()); }); console.log("Program Ended"); |
Здесь fs.readFile() — это асинхронная функция, которая должна считывать файл. Если во время операции чтения возникает ошибка, объект err будет содержать соответствующую ошибку, иначе считывается содержимое файла. readFile передает err и данные в функцию обратного вызова после завершения операции чтения, которая выводит содержимое.
1 2 3 |
Program Ended Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! |
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.