Tutorial de promessa do Node.js

Em tutoriais anteriores, vocรช deve ter visto funรงรตes de retorno de chamada usadas para eventos assรญncronos. Mas ร s vezes as funรงรตes de retorno de chamada podem se tornar um pesadelo quando comeรงam a ficar aninhadas e o programa comeรงa a ficar longo e complexo.

O que sรฃo promessas?

Antes de comeรงarmos com as promessas, vamos primeiro revisitar o que sรฃo funรงรตes de โ€œretorno de chamadaโ€ no Node.js. Vimos muito essas funรงรตes de retorno de chamada nos capรญtulos anteriores, entรฃo vamos examinar rapidamente uma delas.

O exemplo abaixo mostra um trecho de cรณdigo, que รฉ usado para conectar-se a um MongoDB banco de dados e execute uma operaรงรฃo de atualizaรงรฃo em um dos registros do banco de dados.

Promessa do Node.js.

  1. No cรณdigo acima, a parte da function(err,db) รฉ conhecida como a declaraรงรฃo de uma funรงรฃo anรดnima ou de retorno de chamada. Quando o MongoClient cria uma conexรฃo com o MongoDB banco de dados, ele retornarรก ร  funรงรฃo de retorno de chamada assim que a operaรงรฃo de conexรฃo for concluรญda. Entรฃo, de certa forma, as operaรงรตes de conexรฃo acontecem em segundo plano e, quando terminam, chama nossa funรงรฃo de retorno de chamada. Lembre-se que este รฉ um dos pontos-chave do Node.js para permitir que muitas operaรงรตes aconteรงam simultaneamente e assim nรฃo impedir que nenhum usuรกrio execute uma operaรงรฃo.
  2. O segundo bloco de cรณdigo รฉ o que รฉ executado quando a funรงรฃo de retorno de chamada รฉ realmente chamada. A funรงรฃo de retorno de chamada apenas atualiza um registro em nosso MongoDB base de dados.

Entรฃo, o que รฉ uma promessa? Bem, uma promessa รฉ apenas um aprimoramento das funรงรตes de retorno de chamada no Node.js. Durante o ciclo de vida de desenvolvimento, pode haver uma instรขncia em que vocรช precisarรก aninhar vรกrias funรงรตes de retorno de chamada. Isso pode ficar meio confuso e difรญcil de manter em um determinado momento. Resumindo, uma promessa รฉ um aprimoramento nos retornos de chamada que visa aliviar esses problemas.

A sintaxe bรกsica de uma promessa รฉ mostrada abaixo;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • โ€œdoSomethingAyncโ€ รฉ qualquer retorno de chamada ou funรงรฃo assรญncrona que faz algum tipo de processamento.
  • Desta vez, ao definir o retorno de chamada, hรก um valor que รฉ retornado denominado โ€œpromessaโ€.
  • Quando uma promessa รฉ retornada, ela pode ter 2 saรญdas. Isso รฉ definido pela 'clรกusula then'. A operaรงรฃo pode ser um sucesso, indicado pelo parรขmetro 'onFulfilled'. Ou pode haver um erro indicado pelo parรขmetro 'onRejected'.

Observaรงรฃo: Portanto, o aspecto principal de uma promessa รฉ o valor de retorno. Nรฃo hรก conceito de valor de retorno ao trabalhar com retornos de chamada normais em Node.js. Por causa do valor de retorno, temos mais controle sobre como a funรงรฃo de retorno de chamada pode ser definida.

No prรณximo tรณpico veremos um exemplo de promessas e como elas se beneficiam dos callbacks.

Retornos de chamada para promessas

Agora vamos ver um exemplo de como podemos usar โ€œpromessasโ€ em uma aplicaรงรฃo Node.js. Para usar promessas em uma aplicaรงรฃo Node.js, o mรณdulo 'promessa' deve primeiro ser baixado e instalado.

Em seguida, modificaremos nosso cรณdigo conforme mostrado abaixo, que atualiza um Employeename na coleรงรฃo 'Employee' usando promessas.

Passo 1) Instalando os Mรณdulos NPM

Para usar Promises em um aplicativo Node JS, o mรณdulo de promessa รฉ necessรกrio. Para instalar o mรณdulo de promessa, execute o comando abaixo

promessa de instalaรงรฃo npm

Passo 2) Modifique o cรณdigo para incluir promessas

Retornos de chamada para promessas

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"
            }
        });
    }); 

Explicaรงรฃo do cรณdigo: -

  1. A primeira parte รฉ incluir o mรณdulo 'promessa' que nos permitirรก usar a funcionalidade de promessa em nosso cรณdigo.
  2. Agora podemos anexar a funรงรฃo 'then' ร  nossa funรงรฃo MongoClient.connect. Entรฃo, o que isso faz รฉ que, quando a conexรฃo com o banco de dados for estabelecida, precisamos executar o trecho de cรณdigo definido a seguir.
  3. Por fim, definimos nosso trecho de cรณdigo que faz o trabalho de atualizar EmployeeName do funcionรกrio com o nome โ€œMartinโ€ para โ€œMohanโ€.

Nota:-

Se vocรช verificar agora o conteรบdo do seu MongoDB banco de dados, vocรช descobrirรก que se existir um registro com EmployeeName de โ€œMartinโ€, ele serรก atualizado para โ€œMohanโ€.

Para verificar se os dados foram inseridos corretamente no banco de dados, vocรช precisa executar os seguintes comandos em MongoDB

  1. Usar EmployeeDB
  2. db.Employee.find({NomedoFuncionรกrio:Mohan})

A primeira instruรงรฃo garante que vocรช esteja conectado ao banco de dados EmployeeDb. O segundo extrato busca o registro que contรฉm o nome do funcionรกrio โ€œMohanโ€.

Lidando com promessas aninhadas

Ao definir promessas, รฉ necessรกrio observar que o prรณprio mรฉtodo โ€œentรฃoโ€ retorna uma promessa. Entรฃo, de certa forma, as promessas podem ser aninhadas ou encadeadas umas ร s outras.

No exemplo abaixo, usamos encadeamento para definir 2 funรงรตes de retorno de chamada, ambas inserem um registro no MongoDB base de dados.

(Observaรงรฃo: Encadeamento รฉ um conceito usado para vincular a execuรงรฃo de mรฉtodos entre si. Suponha que seu aplicativo tivesse 2 mรฉtodos chamados 'methodA' e 'methodB.' E a lรณgica era tal que 'mรฉtodoB' deveria ser chamado depois de 'mรฉtodoA', entรฃo vocรช encadearia a execuรงรฃo de tal forma que 'mรฉtodoB' fosse chamado diretamente apรณs 'mรฉtodoA'.)

A principal coisa a ser observada neste exemplo รฉ que o cรณdigo se torna mais limpo, legรญvel e de fรกcil manutenรงรฃo usando promessas aninhadas.

Lidando com promessas aninhadas

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"
        })
    })
});

Explicaรงรฃo do cรณdigo: -

  1. Agora estamos definindo 2 clรกusulas โ€œthenโ€ que sรฃo executadas uma apรณs a outra. Na primeira clรกusula then, estamos passando o parรขmetro 'db' que contรฉm nossa conexรฃo com o banco de dados. Estamos entรฃo usando a propriedade de coleรงรฃo da conexรฃo 'db' para inserir registros na coleรงรฃo 'Employee'. O mรฉtodo 'insertOne' รฉ usado para inserir o documento real na coleรงรฃo Employee.
  2. Estamos entรฃo usando o 2nd clรกusula then tambรฉm para inserir outro registro no banco de dados.

Se vocรช verificar agora o conteรบdo do seu MongoDB banco de dados, vocรช encontrarรก os 2 registros inseridos no MongoDB base de dados.

Criando uma promessa personalizada

Uma promessa personalizada pode ser criada usando um mรณdulo de nรณ chamado 'q.' A biblioteca 'q' precisa ser baixada e instalada usando o gerenciador de pacotes do nรณ. Depois de usar a biblioteca 'q', o mรฉtodo โ€œdenodeifyโ€ pode ser chamado, o que farรก com que qualquer funรงรฃo se torne uma funรงรฃo que retorna uma promessa.

No exemplo abaixo, criaremos uma funรงรฃo simples chamada โ€œAdicionarโ€ que irรก somar 2 nรบmeros. Converteremos esta funรงรฃo em uma funรงรฃo para retornar uma promessa.

Feito isso, usaremos a promessa retornada pela funรงรฃo Add para exibir uma mensagem no console.log.

Vamos seguir as etapas abaixo para criar nossa funรงรฃo personalizada para retornar uma promessa.

Passo 1) Instalando os Mรณdulos NPM

Para usar 'q' em um aplicativo Node JS, o mรณdulo 'q' รฉ necessรกrio. Para instalar o mรณdulo 'q', execute o comando abaixo

npm instalar q

Passo 2) Defina o cรณdigo a seguir que serรก usado para criar a promessa personalizada.

Criando uma promessa personalizada

Explicaรงรฃo do cรณdigo: -

  1. A primeira parte รฉ incluir a biblioteca 'q' usando a palavra-chave require. Ao usar esta biblioteca, poderemos definir qualquer funรงรฃo para retornar um retorno de chamada.
  2. Estamos criando uma funรงรฃo chamada Add que irรก somar 2 nรบmeros definidos nas variรกveis โ€‹โ€‹a e b. A soma desses valores serรก armazenada na variรกvel c.
  3. Estamos entรฃo usando a biblioteca q para denodeificar (o mรฉtodo usado para converter qualquer funรงรฃo em uma funรงรฃo que retornaria uma promessa) nossa funรงรฃo Add ou de outra forma converter nossa funรงรฃo Add em uma funรงรฃo que retorna uma promessa.
  4. Agora chamamos nossa funรงรฃo โ€œAdicionarโ€ e podemos obter um valor de promessa de retorno por causa da etapa anterior que realizamos de denodeificar a funรงรฃo Adicionar.
  5. A palavra-chave 'then' รฉ usada para especificar que, se a funรงรฃo for executada com sucesso, exiba a string โ€œFunรงรฃo de adiรงรฃo concluรญdaโ€ no console.log.

Quando o cรณdigo acima for executado, a saรญda โ€œFunรงรฃo de adiรงรฃo concluรญdaโ€ serรก exibida no console.log conforme mostrado abaixo.

Criando uma promessa personalizada

Resumo

  • O uso de funรงรตes de retorno de chamada no Node.js tem suas desvantagens. ร€s vezes, durante o processo de desenvolvimento, o uso aninhado de funรงรตes de retorno de chamada pode tornar o cรณdigo mais confuso e difรญcil de manter.
  • A maioria dos problemas com funรงรตes de retorno de chamada aninhadas podem ser mitigadas com o uso de promessas e geradores em node.js
  • Uma Promessa รฉ um valor retornado por uma funรงรฃo assรญncrona para indicar a conclusรฃo do processamento realizado pela funรงรฃo assรญncrona.
  • As promessas podem ser aninhadas umas nas outras para fazer o cรณdigo parecer melhor e mais fรกcil de manter quando uma funรงรฃo assรญncrona precisar ser chamada apรณs outra funรงรฃo assรญncrona

Resuma esta postagem com: