Tengo un módulo de nodo simple que se conecta a una base de datos y tiene varias funciones para recibir datos, por ejemplo esta función:
dbConnection.js:
import mysql from 'mysql';
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'db'
});
export default {
getUsers(callback) {
connection.connect(() => {
connection.query('SELECT * FROM Users', (err, result) => {
if (!err){
callback(result);
}
});
});
}
};
El módulo se llamaría de esta manera desde un módulo de nodo diferente:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
Me gustaría usar promesas en lugar de devoluciones de llamada para devolver los datos. Hasta ahora he leído sobre las promesas anidadas en el siguiente hilo: Escribir código limpio con promesas anidadas , pero no pude encontrar ninguna solución que sea lo suficientemente simple para este caso de uso. ¿Cuál sería la forma correcta de regresar result
usando una promesa?
Respuestas:
Usando la
Promise
claseRecomiendo echar un vistazo a los documentos de Promise de MDN que ofrecen un buen punto de partida para usar Promises. Alternativamente, estoy seguro de que hay muchos tutoriales disponibles en línea. :)
Nota: Los navegadores modernos ya admiten la especificación ECMAScript 6 de Promises (consulte los documentos de MDN vinculados anteriormente) y supongo que desea usar la implementación nativa, sin bibliotecas de terceros.
En cuanto a un ejemplo real ...
El principio básico funciona así:
resolve
yreject
Esto puede parecer mucho, así que aquí hay un ejemplo real.
Usando la función de lenguaje asincrónico / en espera (Node.js> = 7.6)
En Node.js 7.6, el compilador de JavaScript v8 se actualizó con soporte async / await . Ahora puede declarar funciones como siendo
async
, lo que significa que devuelven automáticamente unPromise
que se resuelve cuando la función asíncrona completa la ejecución. Dentro de esta función, puede usar laawait
palabra clave para esperar hasta que se resuelva otra Promesa.Aquí hay un ejemplo:
fuente
Con bluebird puede usar
Promise.promisifyAll
(yPromise.promisify
) para agregar métodos listos para Promise a cualquier objeto.Y usa así:
o
Agregar trituradores
Bluebird admite muchas funciones, una de ellas son los trituradores, que le permite eliminar de forma segura una conexión después de que finaliza con la ayuda de
Promise.using
yPromise.prototype.disposer
. Aquí hay un ejemplo de mi aplicación:Entonces úsalo así:
Esto terminará automáticamente la conexión una vez que la promesa se resuelva con el valor (o se rechace con un
Error
).fuente
try-catch
en cada llamada. Entonces, si lo hace con bastante frecuencia, y la complejidad de su código es similar a la de la muestra, debería reconsiderar esto.Node.js versión 8.0.0+:
Ya no tiene que usar bluebird para prometer los métodos de API de nodo. Porque, a partir de la versión 8+, puede utilizar util.promisify nativo :
Ahora, no tienes que usar ninguna biblioteca de terceros para hacer la promesa.
fuente
Suponiendo que la API de su adaptador de base de datos no se genera por
Promises
sí misma, puede hacer algo como:Si la API de la base de datos es compatible
Promises
, puede hacer algo como: (aquí puede ver el poder de Promises, su error de devolución de llamada prácticamente desaparece)Utilizando
.then()
para devolver una nueva promesa (anidada).Llamar con:
Usé una API de maqueta para mis Promesas, su API puede ser diferente. Si me muestra su API, puedo adaptarla.
fuente
Promise
constructor y un.promise()
método?promise = new Promise();
?Promises
entonces está atascado con el uso de devoluciones de llamada. Una vez que entras en territorio prometido, la 'pirámide' desaparece. Vea el segundo ejemplo de código sobre cómo funcionaría.2019:
Use ese módulo nativo
const {promisify} = require('util');
para convertir el patrón de devolución de llamada antiguo simple en el patrón de promesa para que pueda beneficiarse delasync/await
códigofuente
Al configurar una promesa, toma dos parámetros
resolve
yreject
. En caso de éxito, llameresolve
con el resultado, en caso de falla, llamereject
con el error.Entonces puedes escribir:
callback
será llamado con el resultado de la promesa devueltagetUsers
, es decirresult
fuente
Usando la biblioteca Q, por ejemplo:
fuente
El siguiente código funciona solo para el nodo -v> 8.x
Utilizo este middleware MySQL promisificado para Node.js
lea este artículo Cree un middleware de base de datos MySQL con Node.js 8 y Async / Await
database.js
Debe actualizar el nodo -v> 8.x
debe usar la función asíncrona para poder usar await.
ejemplo:
fuente