¿Qué es Callback Hell y cómo evitarlo en Node.js?

En este artículo, aprenderemos sobre Callback Hell y cómo se puede evitar. Las devoluciones de llamada son las situaciones en las que tenemos devoluciones de llamada anidadas complejas. Como hemos mencionado el término «Callback», así que antes de sumergirnos en los detalles de Callback Hell, sepamos un poco sobre qué es Callback. Una devolución de llamada es una función que se llama automáticamente cuando se completa una tarea en particular. Básicamente, permite que el programa ejecute otro código hasta que no se complete una determinada tarea. Esta función 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, lo que hace que nodeJs sea altamente escalable.

Sintaxis: 

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

¿Qué es Callback Hell?

El infierno de devolución de llamada en Node.js es la situación en la que tenemos devoluciones de llamada anidadas complejas. En esto, cada devolución de llamada toma argumentos que se han obtenido como resultado de devoluciones de llamada anteriores. De esta manera, la estructura del código parece una pirámide, lo que conduce a una menor legibilidad y dificultad en el mantenimiento. Además, si hay un error en una función, todas las demás funciones se ven afectadas.

Creando la estructura: 

Paso 1: en primer lugar, cree un archivo de texto input.txt con el siguiente texto:

Welcome to GFG.
Learn NodeJS with GeeksforGeeks

Paso 2: Ahora, cree un nombre de archivo javascript main.js.

Estructura del proyecto: 

novia

Ejemplo: Este es un ejemplo simple de Callback Hell. Podemos ver que en el código hay devoluciones de llamadas anidadas que dificultan la comprensión del código. 

Javascript

var fs = require("fs");
var textFile = "input.txt";
fs.exists(textFile, function (exists) {
    if (exists) {
        fs.stat(textFile, function (err, res) {
            if (err) {
                throw err;
            }
            if (res.isFile()) {
                fs.readFile(textFile, 
                    "utf-8", function (err, data) {
                    if (err) {
                        throw err;
                    }
                    console.log(data);
                });
            }
        });
    }
});

Ejecute el servidor: ahora ejecute main.js para ver el resultado con el siguiente comando:

node main.js

Producción:

En este ejemplo, tenemos un módulo fs de nodeJS que proporciona la funcionalidad de las operaciones de E/S de archivos. Con la ayuda de la función existe(), podemos probar si la ruta dada existe o no en el sistema de archivos. Si existe, hemos definido una función dentro de él. Por lo tanto, en este ejemplo, estamos definiendo la función dentro de otra función que crea un problema infernal de devolución de llamada para nosotros, ya que es difícil de entender y leer el código.

¿Cómo podemos evitar el “infierno de devolución de llamada”?

  • Promise: con la ayuda de Promises callback, se puede evitar el infierno. Las promesas en javascript son una forma de manejar operaciones asincrónicas en Node.js. Nos permite devolver un valor de una función asíncrona como las funciones síncronas. Cuando devolvemos algo de un método asíncrono, devuelve una promesa que se puede usar para consumir el valor final cuando esté disponible en el futuro con la ayuda del método then() o espera dentro de las funciones asíncronas. La sintaxis para crear una promesa se menciona a continuación.

Sintaxis:

const promise = new Promise(function (resolve, reject) {
    // code logic
});

Ejemplo: en este ejemplo, estamos leyendo un textil llamado «input.txt» con la ayuda de promesas. Cree un nombre de archivo javascript main.js y escriba el siguiente código:

Javascript

var fs = require('fs');
const fsPromises = require('fs').promises;
fs.promises.readFile("input.txt")
    .then(function (data) {
        console.log("" + data);
    })
    .catch(function (error) {
        console.log(error);
    })

Ejecute el servidor: ahora ejecute main.js para ver el resultado con el siguiente comando:

node main.js

Producción:

En este ejemplo, tenemos un módulo fs de nodeJS que proporciona la funcionalidad de las operaciones de E/S de archivos. Luego leemos el archivo con la ayuda del método fs.promises.readfile que devuelve una promesa.

  • Async.js: otra forma de evitar el infierno de devolución de llamada es que tenemos este módulo npm llamado Async. Async es útil para administrar JavaScript asíncrono. Algunos métodos útiles de Async son serie, paralelo, cascada, etc. También funciona para navegadores.

Instalación:

npm i async
  • Para evitar la devolución de llamada, debemos evitar el uso de más de dos funciones de devolución de llamada anidadas en un programa, ya que ayudará a mantener la legibilidad del código.

Publicación traducida automáticamente

Artículo escrito por archnabhardwaj y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *