Node.js: bucle de eventos

Node.js es una aplicación de un solo subproceso, pero puede admitir la simultaneidad a través del concepto de event y callbacks. Cada API de Node.js es asincrónica y, al ser de un solo subproceso, utilizanasync function callspara mantener la concurrencia. El nodo utiliza un patrón de observador. El subproceso de nodo mantiene un bucle de eventos y cada vez que se completa una tarea, activa el evento correspondiente que indica que se ejecute la función de escucha de eventos.

Programación basada en eventos

Node.js usa eventos en gran medida y también es una de las razones por las que Node.js es bastante rápido en comparación con otras tecnologías similares. Tan pronto como Node inicia su servidor, simplemente inicia sus variables, declara funciones y luego simplemente espera a que ocurra el evento.

En una aplicación impulsada por eventos, generalmente hay un bucle principal que escucha eventos y luego activa una función de devolución de llamada cuando se detecta uno de esos eventos.

Aunque los eventos se parecen bastante a las devoluciones de llamada, la diferencia radica en el hecho de que las funciones de devolución de llamada se llaman cuando una función asincrónica devuelve su resultado, mientras que el manejo de eventos funciona en el patrón del observador. Las funciones que escuchan eventos actúan comoObservers. Siempre que se activa un evento, su función de escucha comienza a ejecutarse. Node.js tiene varios eventos incorporados disponibles a través del módulo de eventos y la clase EventEmitter que se utilizan para vincular eventos y oyentes de eventos de la siguiente manera:

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

A continuación se muestra la sintaxis para vincular un controlador de eventos con un evento:

// Bind event and event  handler as follows
eventEmitter.on('eventName', eventHandler);

Podemos disparar un evento programáticamente de la siguiente manera:

// Fire an event 
eventEmitter.emit('eventName');

Ejemplo

Cree un archivo js llamado main.js con el siguiente código:

// 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.");

Ahora intentemos ejecutar el programa anterior y verificar su salida:

$ node main.js

Debería producir el siguiente resultado:

connection successful.
data received successfully.
Program Ended.

¿Cómo funcionan las aplicaciones de nodo?

En la aplicación de nodo, cualquier función asincrónica acepta una devolución de llamada como último parámetro y una función de devolución de llamada acepta un error como primer parámetro. Repasemos el ejemplo anterior nuevamente. Cree un archivo de texto llamado input.txt con el siguiente contenido.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Cree un archivo js llamado main.js que tenga el siguiente código:

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");

Aquí fs.readFile () es una función asíncrona cuyo propósito es leer un archivo. Si ocurre un error durante la operación de lectura, entonces elerr object contendrá el error correspondiente, de lo contrario los datos contendrán el contenido del archivo. readFile pasa err y datos a la función de devolución de llamada después de que se completa la operación de lectura, que finalmente imprime el contenido.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!