Tutorial de promesa de Node.js
En tutoriales anteriores, habrรกs visto funciones de devoluciรณn de llamada que se utilizan para eventos asincrรณnicos. Pero a veces, las funciones de devoluciรณn de llamada pueden convertirse en una pesadilla cuando comienzan a anidarse y el programa comienza a volverse largo y complejo.
ยฟ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 operaciรณn de actualizaciรณn en uno de los registros de la base de datos.
- 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 se complete la operaciรณn de conexiรณn. Entonces, en cierto sentido, las operaciones de conexiรณn 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 muchas operaciones sucedan al mismo tiempo y asรญ no bloquear a ningรบn usuario para que no pueda realizar una operaciรณn.
- 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 funciรณn asincrรณ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 dos resultados. Esto se define mediante la clรกusula "then". La operaciรณn puede ser exitosa, lo que se indica mediante el parรกmetro "onFulfilled", o puede tener un error, lo que se indica mediante 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.
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: -
- La primera parte es incluir el mรณdulo "promesa" que nos permitirรก utilizar la funcionalidad de promesa en nuestro cรณdigo.
- 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.
- 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 los siguientes comandos en MongoDB
- Utilice la base de datos de empleados
- 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.
(Nota: : 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 mรกs importante a tener en cuenta en este ejemplo es que el cรณdigo se vuelve mรกs limpio, legible y fรกcil de mantener al usar 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: -
- 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.
- 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 โAddโ que sumarรก 2 nรบmeros. Convertiremos esta funciรณn en una funciรณn que devuelva 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) Defina el siguiente cรณdigo que se utilizarรก para crear la promesa personalizada.
Explicaciรณn del cรณdigo: -
- 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.
- Estamos creando una funciรณn llamada Add que sumarรก dos nรบmeros definidos en las variables a y b. La suma de estos valores se almacenarรก en la variable c.
- Luego usamos la biblioteca q para desnodeificar (el mรฉtodo usado para convertir cualquier funciรณn en una funciรณn que devolverรญa una promesa) nuestra funciรณn Add o, de lo contrario, convertir nuestra funciรณn Add en una funciรณn que devuelve una promesa.
- 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.
- 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, el resultado โFunciรณn de adiciรณn completadaโ se mostrarรก en console.log como se muestra a continuaciรณn.
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 llamada anidadas se pueden mitigar con el uso de promesas y generadores en Node.js
- Una Promesa es un valor devuelto por una funciรณn asincrรณnica para indicar la finalizaciรณn del procesamiento realizado por la funciรณn asincrรณnica.
- Las promesas se pueden anidar unas dentro de otras para hacer que el cรณdigo se vea mejor y sea mรกs fรกcil de mantener cuando se necesita llamar a una funciรณn asincrรณnica despuรฉs de otra funciรณn asincrรณnica.





