Bluebird NPM: promessa do Bluebird JS com exemplo

โšก Resumo Inteligente

Bluebird JS รฉ uma biblioteca de Promises completa para JavaScript cuja principal funcionalidade รฉ a promisificaรงรฃo: converter mรณdulos Node baseados em callbacks em mรณdulos que retornam promessas, de modo que uma biblioteca inteira como a MongoDB O driver pode ser usado de forma assรญncrona.

  • ???? Capacidade principal: `promisifyAll` envolve todos os mรฉtodos de um mรณdulo, acrescentando o sufixo `Async` que indica que o mรฉtodo agora retorna uma promessa.
  • ๐Ÿ“ฆ Instalaรงรฃo: Um รบnico comando `npm install bluebird` adiciona a biblioteca, apรณs o qual `require` expรตe o objeto Promise.
  • ๐Ÿ”— Encadeamento: Cada um recebe entรฃo o valor de resoluรงรฃo anterior, o que substitui os callbacks aninhados por uma sequรชncia simples de etapas.
  • ๐Ÿท๏ธ Regra de nomenclatura: Somente as variantes com o sufixo Async retornam promessas; os mรฉtodos de retorno de chamada originais permanecem inalterados.
  • ๐Ÿ›ก๏ธ Caminho de falha: Um รบnico intercepto no final de uma cadeia recebe rejeiรงรตes de todas as etapas anteriores.
  • โš–๏ธ Contexto Moderno: As promises nativas e o async/await agora abrangem a maior parte do que o Bluebird antes oferecia exclusivamente.

Bluebird JS Promessas

O que รฉ Bluebird JS?

Bluebird JS รฉ uma biblioteca de Promises completa para JavaScript. Sua principal caracterรญstica รฉ permitir que vocรช "prometa" outros mรณdulos do Node para usรก-los de forma assรญncrona. Promisificar รฉ um conceito aplicado a funรงรตes de retorno de chamada (callbacks), garantindo que toda funรงรฃo de retorno de chamada executada retorne um valor.

Entรฃo, se um Node.js O mรณdulo contรฉm uma funรงรฃo de retorno de chamada que nรฃo retorna um valor, prometendo que o mรณdulo modificarรก automaticamente todas as funรงรตes nele contidas para que cada uma retorne um valor.

Isso significa que vocรช pode usar o Bluebird para fazer o MongoDB O mรณdulo รฉ executado de forma assรญncrona, o que adiciona um nรญvel extra de facilidade ao escrever aplicaรงรตes Node.js.

O exemplo abaixo primeiro estabelece uma conexรฃo com a coleรงรฃo โ€œEmployeeโ€ no banco de dados โ€œEmployeeDBโ€. Uma vez estabelecida a conexรฃo, ele recupera todos os registros da coleรงรฃo e os exibe no console.

Como gerar promessas com a biblioteca Bluebird JS

Aqui estรก um exemplo passo a passo mostrando como gerar promessas com a biblioteca Bluebird JS.

Passo 1) Instalando os mรณdulos NPM

Para usar o Bluebird em uma aplicaรงรฃo Node, o mรณdulo Bluebird รฉ necessรกrio. Instale-o com o comando abaixo:

npm install bluebird

Etapa 2) Inclua o mรณdulo Bluebird

O prรณximo passo รฉ incluir o mรณdulo Bluebird no seu cรณdigo e transformรก-lo em uma promessa. MongoDB mรณdulo. Promissor aqui significa que o Bluebird garante que cada mรฉtodo definido no MongoDB biblioteca retorna uma promessa.

Incluir mรณdulos Bluebird

Code Explicaรงรฃo:

  1. O require O comando inclui a biblioteca Bluebird.
  2. Pรกssaro Azul .promisifyAll() O mรฉtodo cria uma versรฃo assรญncrona de cada mรฉtodo. MongoDB O mรณdulo fornece as informaรงรตes necessรกrias, de forma que cada um seja executado em segundo plano e retorne uma promessa.

Etapa 3) Conecte-se ao banco de dados

A etapa final consiste em conectar-se ao banco de dados, recuperar todos os registros da coleรงรฃo e exibi-los no log do console.

Conectar ao banco de dados

Code Explicaรงรฃo:

  1. Observe a connectAsync O mรฉtodo รฉ usado em vez do normal. connect mรฉtodo. Bluebird acrescenta o Assรญncrono sufixo para cada mรฉtodo no MongoDB Biblioteca para distinguir as chamadas que retornam promessas daquelas que nรฃo retornam. Mรฉtodos sem o sufixo Async nรฃo possuem essa garantia.
  2. Semelhante a connectAsync, findAsync O mรฉtodo retorna todos os registros em MongoDB Coleรงรฃo โ€œFuncionรกrioโ€.
  3. If findAsync Se a operaรงรฃo for resolvida com sucesso, o bloco seguinte itera por cada registro da coleรงรฃo e o exibe no console.

Se os passos acima forem executados corretamente, todos os documentos da coleรงรฃo Funcionรกrio serรฃo exibidos no console, conforme mostrado na saรญda abaixo.

Bluebird promete resultados

Segue o cรณdigo completo para referรชncia:

var Promise = require('bluebird');

// promisifyAll adds an Async variant of every MongoDB method
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')

    .then(function(db) {
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        cursor.each(function(err, doc) {
            console.log(doc);
        });
    });

โš ๏ธ Observaรงรฃo sobre a versรฃo do driver: O cรณdigo acima tem como alvo MongoDB Driver Node 2.x, onde connect resolve com um objeto de banco de dados. Do driver 3.0 em diante resolve-se com um MongoClient, entรฃo a cadeia deve chamar client.db('EmployeeDB').collection('Employee') em vez de db.collection('Employee')As versรตes modernas dos drivers tambรฉm jรก retornam promessas nativas, o que torna promisifyAll desnecessรกrio para MongoDB especificamente.

Bluebird vs Native Promises: Qual usar?

Quando o Bluebird foi escrito pela primeira vez, o Node nรฃo tinha nenhum suporte a promises, entรฃo a biblioteca preencheu uma lacuna real na plataforma. O Node passou a oferecer promises nativas a partir da versรฃo 4 e async/await Desde a versรฃo 7.6, o cรกlculo muda consideravelmente para quem estรก comeรงando um projeto hoje.

Aspecto Bluebird Promessas Nativas
Dependรชncia Um pacote npm para instalar e manter. Integrado ao ambiente de execuรงรฃo
Retornos de chamada promissores promisifyAll() converte um mรณdulo inteiro util.promisify() converte uma funรงรฃo
Ajudantes extras mapa, filtro, propriedades, cada, tempo limite, cancelamento todos, todosLimpado, qualquer, raรงa apenas
Pilha longa traces Sim, quando ativado Melhorado, porรฉm mais curto.
Melhor para Bibliotecas de retorno de chamada legadas, auxiliares de concorrรชncia Novo cรณdigo e tudo que utilize async/await.

Escolha promises nativas para novos trabalhos, pois elas nรฃo precisam de dependรชncias e se integram diretamente com async/await. Recorra ao Bluebird quando uma dependรชncia ainda expรตe apenas callbacks ou quando seus auxiliares de concorrรชncia, como Promise.map Com um limite de concorrรชncia, รฉ possรญvel economizar uma quantidade significativa de cรณdigo.

Como lidar com erros com Promises do Bluebird

O exemplo acima nรฃo possui um caminho de falha. Se MongoDB Se a cadeia de promessas nรฃo estiver em execuรงรฃo ou o nome da coleรงรฃo estiver incorreto, ela serรก rejeitada e nada serรก impresso โ€” o processo simplesmente serรก encerrado sem nenhuma explicaรงรฃo. Toda cadeia de promessas precisa de um manipulador de tรฉrmino.

Suporte Bluebird .catch() para rejeiรงรตes e .finally() para limpeza que deve ser executada de qualquer maneira. Tambรฉm oferece suporte a blocos catch tipados, que lidam com uma classe de erro enquanto permitem que outras se propaguem.

var Promise = require('bluebird');
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

var connection;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')
    .then(function(db) {
        connection = db;
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        return cursor.toArrayAsync();
    })
    .then(function(docs) {
        docs.forEach(function(doc) { console.log(doc); });
    })
    .catch(Promise.TimeoutError, function(err) {
        console.error('The database did not respond in time.');
    })
    .catch(function(err) {
        // Any other rejection from any step above arrives here
        console.error('Query failed:', err.message);
    })
    .finally(function() {
        // Runs on success and on failure, so the socket always closes
        if (connection) { connection.close(); }
    });

Trรชs hรกbitos sรฃo importantes aqui. Primeiro, o lugar .catch() no final, em vez de apรณs cada etapa, porque um manipulador de terminal recebe rejeiรงรตes de todos os elos precedentes na cadeia. Em segundo lugar, use .finally() para liberar recursos como uma conexรฃo de banco de dados, jรก que รฉ executado tanto no caminho de sucesso quanto no de falha. Terceiro, nunca deixe uma cadeia sem uma condiรงรฃo: uma rejeiรงรฃo nรฃo tratada encerra o processo do Node nas versรตes atuais, e o Bluebird exibirรก um aviso explรญcito sobre isso antecipadamente. Habilitando pilha longa traces durante o desenvolvimento com Promise.config({ longStackTraces: true }) Isso facilita muito a localizaรงรฃo da origem de uma rejeiรงรฃo.

Erros comuns do Bluebird Promisify e suas soluรงรตes

A maioria dos problemas do Bluebird decorre da convenรงรฃo de nomenclatura baseada em promessas ou da mistura de estilos de chamada de callback e promessa na mesma cadeia, e nรฃo de qualquer falha na biblioteca em si. Cada sintoma abaixo indica sua causa e sua soluรงรฃo.

  • โ€œconnectAsync nรฃo รฉ uma funรงรฃoโ€: O mรณdulo foi exigido diretamente em vez de por meio de promisifyAll()Portanto, nรฃo existem variantes assรญncronas. Envolva a chamada require conforme mostrado acima.
  • Chamando o mรฉtodo simples e obtendo undefined: connect() Ainda espera um retorno de chamada. Somente a cรณpia com o sufixo Async retorna uma promessa.
  • Passando uma funรงรฃo de retorno de chamada para um mรฉtodo assรญncrono: nรฃo fornecer nem um retorno de chamada nem await e a promessa se resolve sem ser observada. Use um estilo por chamada, nรฃo ambos.
  • promisifyAll em uma biblioteca jรก baseada em promessas: Inofensivo, porรฉm inรบtil, e gera nomes confusos com sufixos duplos. Consulte a documentaรงรฃo da biblioteca primeiro.
  • Perder erros silenciosamente: uma corrente sem .catch() Oculta o motivo da rejeiรงรฃo atรฉ que o Node reporte uma rejeiรงรฃo nรฃo tratada e encerre a execuรงรฃo. Sempre finalize a cadeia com um bloco `catch`, mesmo em scripts curtos.

Perguntas Frequentes

`promisifyAll` adiciona uma cรณpia de cada mรฉtodo em vez de substituรญ-lo, de modo que a versรฃo original do callback continue funcionando. O sufixo `Async` marca a cรณpia que retorna a promessa. O sufixo รฉ configurรกvel atravรฉs da opรงรฃo `promisifier`.

Sim. As promessas da Bluebird estรฃo em conformidade com o padrรฃo Promises/A+, portanto. await Aceita-os exatamente como os nativos. Isso permite que vocรช transforme um mรณdulo legado em uma promessa e, em seguida, o consuma com sintaxe moderna.

Sim. Travas deslizantes portรกteis AI Os assistentes reescrevem callbacks aninhados em cadeias de promessas ou usam async/await de forma confiรกvel. Verifique o tratamento de erros posteriormente, pois as conversรตes geradas frequentemente descartam o bloco catch do terminal.

Ferramentas AI trace qual elo em uma cadeia nรฃo possui uma instruรงรฃo de retorno, a causa usual de uma rejeiรงรฃo escapingEles tambรฉm sinalizam cadeias de eventos que nรฃo possuem um bloco `catch` terminal, que รฉ o que transforma um erro tratado em uma falha do sistema.

`Promise.all` aguarda um array de promessas existente. `Promise.map` do Bluebird as constrรณi a partir de valores e aceita um limite de concorrรชncia, o que impede que milhares de requisiรงรตes simultรขneas esgotem os sockets.

Resuma esta postagem com: