Eu tenho um módulo de nó simples que se conecta a um banco de dados e tem várias funções para receber dados, por exemplo esta função:
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);
}
});
});
}
};
O módulo seria chamado desta forma a partir de um módulo de nó diferente:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
Eu gostaria de usar promessas em vez de retornos de chamada para retornar os dados. Até agora, li sobre promessas aninhadas no seguinte thread: Escrevendo código limpo com promessas aninhadas , mas não consegui encontrar nenhuma solução que seja simples o suficiente para este caso de uso. Qual seria a maneira correta de retornar result
usando uma promessa?
Respostas:
Usando a
Promise
classeRecomendo dar uma olhada nos documentos do Promise do MDN, que oferecem um bom ponto de partida para usar o Promises. Como alternativa, tenho certeza de que existem muitos tutoriais disponíveis online. :)
Observação: os navegadores modernos já oferecem suporte à especificação ECMAScript 6 do Promises (consulte os documentos MDN vinculados acima) e presumo que você deseja usar a implementação nativa, sem bibliotecas de terceiros.
Como um exemplo real ...
O princípio básico funciona assim:
resolve
ereject
Isso pode parecer muito, então aqui está um exemplo real.
Usando o recurso de linguagem async / await (Node.js> = 7.6)
No Node.js 7.6, o compilador JavaScript v8 foi atualizado com suporte async / await . Agora você pode declarar funções como sendo
async
, o que significa que elas retornam automaticamente umPromise
que é resolvido quando a função assíncrona completa a execução. Dentro desta função, você pode usar aawait
palavra-chave para esperar até que outra promessa seja resolvida.Aqui está um exemplo:
fonte
Com o bluebird você pode usar
Promise.promisifyAll
(ePromise.promisify
) para adicionar métodos prontos para Promise a qualquer objeto.E use assim:
ou
Adicionando trituradores
O Bluebird oferece suporte a vários recursos, um deles são os trituradores, que permitem que você descarte uma conexão com segurança após o término com a ajuda de
Promise.using
ePromise.prototype.disposer
. Aqui está um exemplo do meu aplicativo:Em seguida, use-o assim:
Isso encerrará automaticamente a conexão assim que a promessa for resolvida com o valor (ou rejeitada com um
Error
).fonte
try-catch
em cada chamada. Portanto, se você faz isso com frequência e a complexidade do código é semelhante à do exemplo, você deve reconsiderar isso.Node.js versão 8.0.0+:
Você não precisa mais usar o bluebird para promisificar os métodos da API do nó. Porque a partir da versão 8+ você pode usar util.promisify nativo :
Agora, não precisa usar nenhuma biblioteca de terceiros para fazer a promessa.
fonte
Supondo que a API do adaptador de banco de dados não produza
Promises
sozinha, você pode fazer algo como:Se a API do banco de dados oferecer suporte,
Promises
você pode fazer algo como: (aqui você vê o poder das promessas, seu erro de retorno de chamada praticamente desaparece)Usando
.then()
para retornar uma nova promessa (aninhada).Ligue com:
Usei uma API de maquete para minhas promessas, sua API pode ser diferente. Se você me mostrar sua API, posso personalizá-la.
fonte
Promise
construtor e um.promise()
método?promise = new Promise();
?Promises
então você está preso ao uso de callbacks. Uma vez que você entra no território prometido, a 'pirâmide' desaparece. Veja o segundo exemplo de código sobre como isso funcionaria.2019:
Use esse módulo nativo
const {promisify} = require('util');
para converter o antigo padrão de retorno de chamada em um padrão de promessa para que você possa obter benefícios doasync/await
códigofonte
Ao configurar uma promessa, você usa dois parâmetros,
resolve
ereject
. Em caso de sucesso, ligueresolve
com o resultado, em caso de falha liguereject
com o erro.Então você pode escrever:
callback
será chamado com o resultado da promessa devolvidagetUsers
, ou seja,result
fonte
Usando a biblioteca Q, por exemplo:
fonte
O código abaixo funciona apenas para o nó -v> 8.x
Eu uso este middleware MySQL Promisified para Node.js
leia este artigo Criar um middleware de banco de dados MySQL com Node.js 8 e Async / Await
database.js
Você deve atualizar o nó -v> 8.x
você deve usar a função assíncrona para poder usar o await.
exemplo:
fonte