Tutorial de promesa de Node.js

En tutoriales anteriores, habrá visto funciones de devolución de llamada que se utilizan para Asyncacontecimientos cronosos. Pero a veces las funciones de devolución de llamada pueden convertirse en una pesadilla cuando empiezan a anidarse y el programa empieza a volverse largo y complejo.plex.

¿Qué son las promesas?

Antes de comenzar con las promesas, primero revisemos qué son las funciones de "devolución de llamada" en Node.js. Hemos visto muchas veces estas funciones de devolución de llamada en los capítulos anteriores, así que repasemos rápidamente una de ellas.

El siguiente ejemplo muestra un fragmento de código, que se utiliza para conectarse a un MongoDB base de datos y realizar una actualización operación en uno de los registros de la base de datos.

Promesa de Node.js

  1. En el código anterior, la parte de la función (err,db) se conoce como declaración de una función anónima o de devolución de llamada. Cuando MongoClient crea una conexión con el MongoDB base de datos, volverá a la función de devolución de llamada una vez que la conexión operase completa la operación. Entonces, en cierto sentido, la conexión operaLas operaciones ocurren en segundo plano y, cuando terminan, llama a nuestra función de devolución de llamada. Recuerde que este es uno de los puntos clave de Node.js para permitir que muchos operaque las acciones sucedan simultáneamente y, por lo tanto, no impidan que ningún usuario realice una operación.
  2. El segundo bloque de código es lo que se ejecuta cuando realmente se llama a la función de devolución de llamada. La función de devolución de llamada solo actualiza un registro en nuestro MongoDB base de datos.

Entonces, ¿qué es una promesa? Bueno, una promesa es solo una mejora de las funciones de devolución de llamada en Node.js. Durante el ciclo de vida de desarrollo, puede haber una instancia en la que necesite anidar varias funciones de devolución de llamada juntas. Esto puede resultar un poco complicado y difícil de mantener en un momento determinado. En resumen, una promesa es una mejora de las devoluciones de llamadas que busca aliviar estos problemas.

La sintaxis básica de una promesa se muestra a continuación;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • “doSomethingAync” es cualquier devolución de llamada o unasyncFunción crónica que realiza algún tipo de procesamiento.
  • Esta vez, al definir la devolución de llamada, se devuelve un valor llamado "promesa".
  • Cuando se devuelve una promesa, puede tener 2 salidas. Esto está definido por la 'cláusula entonces'. O el operaLa operación puede ser un éxito, lo que se indica mediante el parámetro 'onFulfilled'. O puede tener un error indicado por el parámetro 'onRejected'.

Nota: Entonces, el aspecto clave de una promesa es el valor de retorno. No existe el concepto de valor de retorno cuando se trabaja con devoluciones de llamada normales en Node.js. Debido al valor de retorno, tenemos más control sobre cómo se puede definir la función de devolución de llamada.

En el siguiente tema, veremos un ejemplo de promesas y cómo se benefician de las devoluciones de llamada.

Devoluciones de llamada a promesas

Ahora veamos un ejemplo de cómo podemos usar "promesas" desde una aplicación Node.js. Para utilizar promesas en una aplicación Node.js, primero se debe descargar e instalar el módulo 'promesa'.

Luego modificaremos nuestro código como se muestra a continuación, que actualiza un nombre de empleado en la colección 'Empleado' mediante promesas.

Paso 1) Instalación de los módulos NPM

Para utilizar Promesas desde una aplicación Node JS, se requiere el módulo de promesa. Para instalar el módulo de promesa, ejecute el siguiente comando

promesa de instalación de npm

Paso 2) Modifique el código para incluir promesas.

Devoluciones de llamada a promesas

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';

MongoClient.connect(url)
    .then(function(err, db) {
        db.collection('Employee').updateOne({
            "EmployeeName": "Martin"
        }, {
            $set: {
                "EmployeeName": "Mohan"
            }
        });
    }); 

Explicación del código: -

  1. La primera parte es incluir el módulo "promesa" que nos permitirá utilizar la funcionalidad de promesa en nuestro código.
  2. Ahora podemos agregar la función "entonces" a nuestra función MongoClient.connect. Entonces, lo que esto hace es que cuando se establece la conexión con la base de datos, necesitamos ejecutar el fragmento de código definido a continuación.
  3. Finalmente, definimos nuestro fragmento de código que realiza el trabajo de actualizar el nombre del empleado del empleado con el nombre "Martin" a "Mohan".

Nota: -

Si ahora compruebas el contenido de tu MongoDB base de datos, encontrará que si existe un registro con nombre de empleado de "Martin", se actualizará a "Mohan".

Para comprobar que los datos se han insertado correctamente en la base de datos, es necesario ejecutar lo siguientewing comandos en MongoDB

  1. Utilice la base de datos de empleados
  2. db.Empleado.find ({Nombre del empleado: Mohan})

La primera declaración garantiza que está conectado a la base de datos de EmployeeDb. La segunda declaración busca el registro que tiene el nombre del empleado "Mohan".

Tratar con promesas anidadas

Al definir promesas, es necesario tener en cuenta que el método "entonces" en sí devuelve una promesa. Entonces, en cierto sentido, las promesas pueden anidarse o encadenarse entre sí.

En el siguiente ejemplo, utilizamos el encadenamiento para definir 2 funciones de devolución de llamada, las cuales insertan un registro en el MongoDB base de datos.

(Note: El encadenamiento es un concepto utilizado para vincular la ejecución de métodos entre sí. Supongamos que si su aplicación tuviera 2 métodos llamados 'métodoA' y 'métodoB' y la lógica fuera tal que 'métodoB' debería llamarse después de 'métodoA', entonces encadenaría la ejecución de tal manera que se llame directamente a 'métodoB'. después de 'métodoA.')

Lo clave a tener en cuenta en este ejemplo es que el código se vuelve más limpio, readable y mantenible mediante el uso de promesas anidadas.

Lidiar con promesas anidadas

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
MongoClient.connect(url)

.then(function(db) {
    db.collection('Employee').insertOne({
        Employeeid: 4,
        EmployeeName: "NewEmployee"
    })

    .then(function(db1) {
        db1.collection('Employee').insertOne({
            Employeeid: 5,
            EmployeeName: "NewEmployee1"
        })
    })
});

Explicación del código: -

  1. Ahora estamos definiendo 2 cláusulas "entonces" que se ejecutan una tras otra. En la primera cláusula, pasamos el parámetro 'db' que contiene nuestra conexión a la base de datos. Luego usamos la propiedad de colección de la conexión "db" para insertar registros en la colección "Empleado". El método 'insertOne' se utiliza para insertar el documento real en la colección Empleado.
  2. Entonces estamos usando el 2nd luego cláusula también para insertar otro registro en la base de datos.

Si ahora compruebas el contenido de tu MongoDB base de datos, encontrará los 2 registros insertados en la MongoDB base de datos.

Creando una promesa personalizada

Se puede crear una promesa personalizada utilizando un módulo de nodo llamado "q". La biblioteca "q" debe descargarse e instalarse utilizando el administrador de paquetes de nodo. Después de usar la biblioteca 'q', se puede llamar al método "denodeify", lo que hará que cualquier función se convierta en una función que devuelva una promesa.

En el siguiente ejemplo, crearemos una función simple llamada "Agregar" que agregará 2 numbers. Convertiremos esta función en una función para devolver una promesa.

Una vez hecho esto, usaremos la promesa devuelta por la función Agregar para mostrar un mensaje en console.log.

Sigamos los pasos a continuación para crear nuestra función personalizada para devolver una promesa.

Paso 1) Instalación de los módulos NPM

Para usar 'q' desde una aplicación Node JS, se requiere el módulo 'q'. Para instalar el módulo 'q', ejecute el siguiente comando

instalación npm q

Paso 2) Definir el seguimientowing código que se utilizará para crear la promesa personalizada.

Crear una promesa personalizada

Explicación del código: -

  1. El primer bit es incluir la biblioteca 'q' usando la palabra clave require. Al usar esta biblioteca, podremos definir cualquier función para devolver una devolución de llamada.
  2. Estamos creando una función llamada Agregar que agregará 2 numbers definido en las variables a y b. La suma de estos valores se almacenará en la variable c.
  3. Luego estamos usando la biblioteca q para denodeificar (el método usado para convertir cualquier función en una función que devolvería una promesa) nuestra función Agregar o en otroswise convierta nuestra función Agregar en una función que devuelva una promesa.
  4. Ahora llamamos a nuestra función "Agregar" y podemos obtener un valor de promesa de retorno debido al paso anterior que realizamos para denodeificar la función Agregar.
  5. La palabra clave "entonces" se utiliza para especificar que si la función se ejecuta correctamente, se muestra la cadena "Función adicional completada" en console.log.

Cuando se ejecuta el código anterior, se mostrará el resultado "Función de adición completada".yed en console.log como se muestra a continuación.

Crear una promesa personalizada

Resumen

  • El uso de funciones de devolución de llamada en Node.js tiene sus desventajas. A veces, durante el proceso de desarrollo, el uso anidado de funciones de devolución de llamada puede hacer que el código sea más confuso y difícil de mantener.
  • La mayoría de los problemas con las funciones de devolución de llamadas anidadas se pueden mitigar con el uso de promesas y generators en Node.js
  • Una Promesa es un valor devuelto por unsyncfunción cronosa para indicar la finalización del procesamiento realizado por elsyncfunción crónica.
  • Las promesas se pueden anidar entre sí para que el código se vea mejor y sea más fácil de mantener cuandosyncUna función cronosa debe llamarse después de otra.syncfunción cronosa