Promesas en Node.js

Introducción: las funciones de devolución de llamada se utilizan para eventos asíncronos. Siempre que se deba llevar a cabo un evento asincrónico, generalmente se prefiere usar devoluciones de llamada (si los datos no están anidados o son interdependientes).

El siguiente es el ejemplo más simple en el que podemos visualizar cómo podemos usar una devolución de llamada:

Ejemplo: 

javascript

module.exports = (x, callback) => {
    if (x <= 0)
        setTimeout(() =>
            callback(new Error("Square dimensions
            should be greater than zero: s = " + x),
            null), 2000);
    else
        setTimeout(() =>
            callback(null, {
                perimeter: () => (4*(x)),
                area:() => (x*x)
            }), 2000);
}

¿Qué son las Promesas? Una promesa es básicamente un avance de las devoluciones de llamada en Node. En otras palabras, una promesa es un objeto de JavaScript que se usa para manejar todas las operaciones de datos asincrónicos. Mientras desarrolla una aplicación, puede encontrar que está utilizando muchas funciones de devolución de llamada anidadas. 

javascript

dboper.insertDocument(db, { name: "Test", description: "Test"},
    "test", (result) => {
        console.log("Insert Document:\n", result.ops);
 
        dboper.findDocuments(db, "test", (docs) => {
            console.log("Found Documents:\n", docs);
 
            dboper.updateDocument(db, { name: "Test" },
                { description: "Updated Test" }, "test",
                (result) => {
                    console.log("Updated Document:\n", result.result);
 
                    dboper.findDocuments(db, "test", (docs) => {
                        console.log("Found Updated Documents:\n", docs);
                             
                        db.dropCollection("test", (result) => {
                            console.log("Dropped Collection: ", result);
 
                            client.close();
                        });
                    });
                });
        });
    });

Esto es lo que sucede debido al anidamiento de las funciones de devolución de llamada. Ahora imagine si necesita realizar múltiples operaciones anidadas como esta. Eso haría que su código fuera desordenado y muy complejo. En el mundo de Node.js, este problema se llama «Callback Hell» . Para resolver este problema, debemos deshacernos de las funciones de devolución de llamada durante el anidamiento. Aquí es donde las Promesas entran en escena. Una Promesa en Node significa una acción que será completada o rechazada. En caso de cumplimiento, la promesa se cumple y, de lo contrario, la promesa se rompe. Entonces, como sugiere la palabra, o se cumple la promesa o se rompe. Y a diferencia de las devoluciones de llamadas, las promesas se pueden enstringr. 

Callbacks to Promises Promises notifica si la solicitud se cumple o se rechaza. Las devoluciones de llamada se pueden registrar con .then() para manejar el cumplimiento y el rechazo. El .then() se puede enstringr para manejar el cumplimiento y el rechazo, mientras que .catch() se puede usar para manejar los errores (si los hay).

 Ejemplo: 

javascript

dboper.insertDocument(db,
    { name: "Test", description: "Just a test"},
    "test").then((result) => {
        console.log("Insert Document:\n", result.ops);
    });

Promesas anidadas: A menudo encontrará situaciones en las que necesita hacer uso de Promesas anidadas. Las promesas anidadas comienzan con un .then() y en cada uno de los .then() tenemos una declaración de devolución . Después de la declaración de devolución, .then() sigue de la misma manera. El siguiente ejemplo muestra el peor de los casos en el que se utilizan varios métodos .then() para declarar promesas anidadas (que dependen unas de otras para su propia ejecución).

Ejemplo: 

javascript

MongoClient.connect(url).then((client) => {
 
    const db = client.db(database_name);
 
    database.insertDocument(db, { name: "Test",
        description: "Chill Out! Its just a test program!"},
        "test")
        .then((result) => {
            return database.findDocuments(db, "test");
        })
        .then((documents) => {
            console.log("Found Documents:\n", documents);
 
            return database.updateDocument(db, { name: "Test" },
                    { description: "Updated Test" }, "test");
        })
        .then((result) => {
            console.log("Updated Documents Found:\n", result.result);
 
            return database.findDocuments(db, "test");
        })
        .then((docs) => {
            console.log("The Updated Documents are:\n", docs);
                             
            return db.dropCollection("test");
        })
        .then((result) => {
             
            return client.close();
        })
        .catch((err) => alert(err));
 
})
.catch((err) => alert(err));

Ahora, en comparación con el uso de las devoluciones de llamada, nuestro código se ve mucho más limpio que antes. Como .then() se puede enstringr, cada Promesa es fácil de identificar en el código. El .catch(err) se ejecuta si se producen errores. 

Creación de promesas personalizadas Siempre puede crear sus propias promesas personalizadas en Node utilizando el nuevo constructor. 

El siguiente ejemplo nos ayudará a comprender cómo podemos crear promesas personalizadas:

Ejemplo:

javascript

var aPromise = new Promise(function(resolve, reject) {
    request.get(options, function(err, resp, body) {
        if (err) {
            reject(err);
        } else {
            resolve(JSON.parse(body));
        }
    })
});

Publicación traducida automáticamente

Artículo escrito por Jasraj 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 *