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 resultusando una promesa?

Respuestas:
Usando la
PromiseclaseRecomiendo 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í:
resolveyrejectEsto 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 unPromiseque se resuelve cuando la función asíncrona completa la ejecución. Dentro de esta función, puede usar laawaitpalabra 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.usingyPromise.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-catchen 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
Promisessí 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
Promiseconstructor y un.promise()método?promise = new Promise();?Promisesentonces 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/awaitcódigofuente
Al configurar una promesa, toma dos parámetros
resolveyreject. En caso de éxito, llameresolvecon el resultado, en caso de falla, llamerejectcon el error.Entonces puedes escribir:
callbackserá llamado con el resultado de la promesa devueltagetUsers, es decirresultfuente
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