Node.js - Цикл событий
Node.js - однопоточное приложение, но оно может поддерживать параллелизм с помощью концепции event и callbacks. Каждый API Node.js является асинхронным и однопоточным, они используютasync function callsдля поддержания параллелизма. Узел использует шаблон наблюдателя. Узловой поток поддерживает цикл событий, и всякий раз, когда задача завершается, он запускает соответствующее событие, которое сигнализирует функции прослушивателя событий для выполнения.
Программирование, управляемое событиями
Node.js интенсивно использует события, и это также одна из причин, почему Node.js довольно быстр по сравнению с другими подобными технологиями. Как только Node запускает свой сервер, он просто инициирует свои переменные, объявляет функции, а затем просто ждет, когда произойдет событие.
В приложении, управляемом событиями, обычно есть основной цикл, который прослушивает события, а затем запускает функцию обратного вызова при обнаружении одного из этих событий.
Хотя события очень похожи на обратные вызовы, разница заключается в том, что функции обратного вызова вызываются, когда асинхронная функция возвращает свой результат, тогда как обработка событий работает по шаблону наблюдателя. Функции, которые прослушивают события, действуют какObservers. Всякий раз, когда событие запускается, его функция слушателя начинает выполняться. Node.js имеет несколько встроенных событий, доступных через модуль событий и класс EventEmitter, которые используются для привязки событий и слушателей событий следующим образом:
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
Ниже приведен синтаксис для привязки обработчика событий к событию:
// Bind event and event handler as follows
eventEmitter.on('eventName', eventHandler);
Мы можем запустить событие программно следующим образом:
// Fire an event
eventEmitter.emit('eventName');
пример
Создайте файл js с именем main.js со следующим кодом -
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
// Create an event handler as follows
var connectHandler = function connected() {
console.log('connection succesful.');
// Fire the data_received event
eventEmitter.emit('data_received');
}
// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
console.log('data received succesfully.');
});
// Fire the connection event
eventEmitter.emit('connection');
console.log("Program Ended.");
Теперь давайте попробуем запустить указанную выше программу и проверить ее вывод -
$ node main.js
ОНО должно дать следующий результат -
connection successful.
data received successfully.
Program Ended.
Как работают приложения Node?
В Node Application любая асинхронная функция принимает обратный вызов как последний параметр, а функция обратного вызова принимает ошибку как первый параметр. Вернемся к предыдущему примеру еще раз. Создайте текстовый файл с именем input.txt со следующим содержимым.
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Создайте файл js с именем main.js, имеющий следующий код -
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 object будет содержать соответствующую ошибку, иначе данные будут содержать содержимое файла. readFile передает ошибку и данные в функцию обратного вызова после завершения операции чтения, которая, наконец, распечатывает содержимое.
Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!