Tutorial de promesa de Node.js
⚡ Resumen inteligente
En Node.js, las promesas reemplazan las funciones de devolución de llamada anidadas con un objeto devuelto que se resuelve una sola vez, por lo que el trabajo asíncrono con la base de datos se lee como una cadena plana de cláusulas then en lugar de una pirámide de funciones anónimas.
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 repasemos qué son las funciones de "devolución de llamada" en Node.jsHemos visto muchas de estas funciones de devolución de llamada en los capítulos anteriores, así que vamos a repasar 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".
A PROMETEMOS Se ubica en uno de tres estados y se establece una sola vez:
| Estado | Significado |
|---|---|
| Pendiente | El trabajo no ha terminado. |
| cumplido | onFulfilled se ejecuta con el valor. |
| Rechazado | onRejected se ejecuta con el error. |
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.
Nota de versión: Estos ejemplos aún se ejecutan en Node.js 24, la línea LTS activa en 2026. Desde Node.js 15 y rechazo no gestionado finaliza el proceso en lugar de imprimir una advertencia, así que cierra cada cadena con .catch().
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'.
A continuación, modificaremos nuestro código como se muestra a continuación, que actualiza un EmployeeName en la colección 'Employee' mediante el uso de promesas.
Paso 1) Instalación de la Módulos NPM
Para usar Promises dentro de una aplicación Node.js, se requiere el módulo promise. Para instalar el módulo promise, 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" } }); });
Code Explicación:
- 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
- usar EmployeeDB
- db.Employee.find({EmployeeName : “Mohan”})
La primera instrucción garantiza que estés conectado a la base de datos EmployeeDB. La segunda instrucción busca el registro que tiene el nombre de 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" }) }) });
Code Explicación:
- 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 En la base de datos, encontrará los 2 registros insertados en la MongoDB base de datos.
Equivalente moderno: async y await, estándar desde ES2017, consumen estas promesas sin callbacks then y han reemplazado en gran medida basado en generador bibliotecas de control de flujo como co, mientras que el soporte nativo de Promise hace que q y bluebird sean redundantes. El segundo bloque muestra que luego solo recibe db.
Creando una promesa personalizada
Se puede crear una promesa personalizada utilizando el módulo 'q' de Node.js. La biblioteca 'q' debe descargarse e instalarse mediante el Administrador de paquetes de Node. Tras usar la biblioteca 'q', se puede llamar al método "denodeify", que convierte cualquier función en una función que devuelve 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' dentro de 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.
Code Explicación:
- 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 denodeificar (el método utilizado para convertir cualquier función en una función que devuelva una promesa) nuestra función Add o, en otras palabras, convertir nuestra función Add en una función que devuelva 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 'then' se utiliza para especificar que si la función se ejecuta correctamente, se muestre la cadena "Función de adición completada" en el 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.





