En este artículo, aprenderemos sobre las devoluciones de llamada y los eventos en Nodejs. Tanto Callback como Events son conceptos importantes de Nodejs. Aprendamos primero sobre la devolución de llamada.
Concepto de devolución de llamada
Una devolución de llamada es una función que se llama automáticamente cuando se completa una tarea en particular. La función de devolución de llamada permite que el programa ejecute otro código hasta que no se complete una determinada tarea. La función de devolución de llamada se usa mucho en nodeJS. La función de devolución de llamada le permite realizar una gran cantidad de operaciones de E/S que su sistema operativo puede manejar sin esperar a que finalice ninguna operación de E/S. Hace que nodeJS sea altamente escalable. Por ejemplo : en Node.js, cuando una función comienza a leer un archivo, obviamente llevará algo de tiempo, por lo que sin esperar a que se complete esa función, devuelve el control al entorno de ejecución de inmediato para ejecutar la siguiente instrucción. Una vez que se completa la E/S del archivo, la función de devolución de llamada se llamará automáticamente, por lo que no habrá espera ni bloqueo para la E/S del archivo.
Nota: La función de devolución de llamada está siendo reemplazada por async/await en estos días.
Sintaxis: Veamos la sintaxis de la función de devolución de llamada.
const fs = require("fs"); fs.readFile("file_path", "utf8", function(err, data) { if(err) { // Handle the error } else { // Process the file text given with data } });
Ejemplo 1: Código para leer un archivo sincrónicamente en Node.js. Cree un archivo de texto input.txt con el siguiente texto:
Welcome to GFG. Learn NodeJS with GeeksforGeeks
Ahora, cree un nombre de archivo javascript main.js con el siguiente código.
main.js
var fs = require("fs"); var filedata = fs.readFileSync('input.txt'); console.log(filedata.toString()); console.log("End of Program execution");
Ahora ejecute main.js para ver el resultado con el siguiente comando:
node main.js
Explicación : en este ejemplo, tenemos un módulo fs de nodeJS que proporciona la funcionalidad de las operaciones de E/S de archivo. Con la ayuda de la función readFileSync(), podemos usar el enfoque síncrono aquí, que también se denomina funciones de bloqueo, ya que espera que cada instrucción se complete primero antes de pasar a la siguiente. Por lo tanto, en este ejemplo, la función bloquea el programa hasta que lee el archivo y luego continúa con el final del programa.
Producción:
Ejemplo 2: Código para leer un archivo de forma asíncrona en Node.js. Mantenga el archivo «input.txt» igual que antes. Aquí está el código de main.js:
main.js
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString()); }); console.log("End of Program execution");
Ahora ejecute main.js para ver el resultado con el siguiente comando:
node main.js
Explicación: con la ayuda de la función readFile(), podemos usar el enfoque asíncrono aquí, que también se denomina funciones sin bloqueo, ya que nunca espera a que se complete cada instrucción, sino que ejecuta todas las operaciones en el primer intento. . Por lo tanto, en este ejemplo, la función se ejecuta en segundo plano y el control regresa a la siguiente instrucción. Cuando se completa la tarea en segundo plano, se llama a la función de devolución de llamada.
Producción:
Eventos
Cada acción en la computadora se llama un evento. En nodeJS, los objetos pueden disparar eventos. De acuerdo con la documentación oficial de Node.js, es un tiempo de ejecución de JavaScript asincrónico basado en eventos. Node.js tiene una arquitectura basada en eventos que puede realizar tareas asincrónicas. Node.js tiene un módulo de ‘eventos’ que emite eventos con nombre que pueden hacer que se llamen las funciones o devoluciones de llamada correspondientes. Las funciones (devoluciones de llamada) escuchan o se suscriben a que ocurra un evento en particular y cuando ese evento se activa, todas las devoluciones de llamada suscritas a ese evento se activan una por una en el orden en que se registraron.
La clase EventEmitter: Todos los objetos que emiten eventos son instancias de la clase EventEmitter. El evento se puede emitir o escuchar un evento con la ayuda de EventEmitter.
Sintaxis:
const EventEmitter=require('events'); var eventEmitter=new EventEmitter();
La siguiente tabla enumera todos los métodos importantes de la clase EventEmitter:
Métodos de emisor de eventos | Descripción |
eventEmitter.addListener(evento, oyente) && eventEmitter.on(evento, oyente) |
eventEmmitter.on(event, listener) y eventEmitter.addListener(event, listener) son bastante similares. Agrega el oyente al final de la array de oyentes para el evento especificado. Múltiples llamadas al mismo evento y oyente agregarán el oyente varias veces y, en consecuencia, se activarán varias veces. Ambas funciones devuelven emitter, por lo que las llamadas se pueden enstringr. |
eventEmitter.once(evento, oyente) | Se activa como máximo una vez para un evento en particular y se eliminará de la array de oyentes después de haber escuchado una vez. Devuelve el emisor, por lo que las llamadas se pueden enstringr. |
eventEmitter.emit(evento, [arg1], [arg2], […]) | Cada evento se denomina evento en nodeJS. Podemos desenstringr un evento mediante la función emit(event, [arg1], [arg2], […]). Podemos pasar un conjunto arbitrario de argumentos a las funciones de escucha. |
eventEmitter.removeListener(evento, oyente) | Toma dos eventos de argumento y un oyente y elimina ese oyente de la array del oyente que está suscrito a ese evento. |
eventEmitter.removeAllListeners() | Elimina todos los oyentes de la array que están suscritos al evento mencionado. |
eventEmitter.getMaxListeners(n) | Devolverá el valor máximo de oyentes establecido por setMaxListeners() o el valor predeterminado 10. |
EventEmitter.defaultMaxListeners | De forma predeterminada, se pueden registrar un máximo de 10 oyentes para un solo evento. Para cambiar el valor predeterminado para todas las instancias de EventEmitter, se puede usar esta propiedad. |
eventEmitter.listeners(evento) | Devuelve una array de oyentes para el evento especificado. |
eventEmitter.listenerCount() | Devuelve el número de oyentes escuchando el evento especificado. |
eventEmitter.prependOnceListener() | Agregará el oyente de una sola vez al comienzo de la array. |
eventEmitter.prependListener() | Agregará el oyente al comienzo de la array. |
Ejemplo 1: Código para crear un programa de un evento simple:
main.js
const EventEmitter = require('events'); // Initializing event emitter instances var eventEmitter = new EventEmitter(); // Create an event handler: var EventHandler = function () { console.log('Learn nodejs!'); } // Assign the event handler to an event: eventEmitter.on('event1', EventHandler); // Fire the 'scream' event: eventEmitter.emit('event1');
Ahora ejecute main.js para ver el resultado con el siguiente comando:
node main.js
Producción:
Ejemplo 2: Este ejemplo muestra la creación y eliminación del oyente. La instancia de EventEmitter emitirá su propio evento ‘newListener’. El evento ‘removeListener’ se emite después de que se elimina un oyente.
main.js
// Importing events const EventEmitter = require('events'); // Initializing event emitter instances var eventEmitter = new EventEmitter(); // Register to newListener eventEmitter.on( 'newListener', (event, listener) => { console.log(`The listener is added to ${event}`); }); // Register to removeListener eventEmitter.on( 'removeListener', (event, listener) => { console.log(`The listener is removed from ${event}`); }); // Declaring listener fun1 to myEvent1 var fun1 = (msg) => { console.log("Message from fun1: " + msg); }; // Declaring listener fun2 to myEvent2 var fun2 = (msg) => { console.log("Message from fun2: " + msg); }; // Listening to myEvent with fun1 and fun2 eventEmitter.on('myEvent', fun1); eventEmitter.on('myEvent', fun2); // Removing listener eventEmitter.off('myEvent', fun1); // Triggering myEvent eventEmitter.emit('myEvent', 'Event occurred');
Ahora ejecute main.js para ver el resultado con el siguiente comando:
node main.js
Producción:
Publicación traducida automáticamente
Artículo escrito por archnabhardwaj y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA