DEV Community

Cover image for Entendendo Promises no JavaScript
Alex Coelho
Alex Coelho

Posted on

Entendendo Promises no JavaScript

Ao trabalhar com chamadas assíncronas no JavaScript em algum momento você já se deparou com uma promise, talvez até sem saber exatamente que estava utilizando uma, mas por de trás dos panos ela estava lá.

Uma promise é o objeto retornado de uma chamada assíncrona que possui a promessa de um valor, seja ele um valor futuro, imediato ou que nunca existirá. São exatamente estes os estados de uma promise:

  • pending (pendente): ainda não foi finalizada, mas também não foi rejeitada
  • fulfilled (realizada): sucesso na operação.
  • rejected (rejeitado): falha na operação.

Quando uma promise é realizada significa que a chamada assíncrona foi finalizada e não foi encontrado nenhum erro na sua execução, neste momento ela terá um valor, caso essa chamada seja rejeitada, ela terá um motivo (erro).

Criação da promise

let promise = new Promise((resolve, reject) => {
    console.log("Comando de dentro da promise")
});
console.log(promise)
Enter fullscreen mode Exit fullscreen mode

image

Perceba que por ela não ter sido resolvida ainda, ela apresenta o status de pending.

Resolvendo uma promise

promise = new Promise((resolve, reject) => {
    resolve(10)
});
console.log(promise)
Enter fullscreen mode Exit fullscreen mode

image

Agora passando o valor 10 para a função resolve teremos a promise com o status de fulfilled e valor 10.

Rejeitando uma promise

promise = new Promise((resolve, reject) => {
    reject("Erro na promise")
})
console.log(promise)
Enter fullscreen mode Exit fullscreen mode

image

Note que a promise é rejeitada possuindo um motivo pelo qual ela foi rejeitada, neste caso é o texto passado para a função reject.

Trabalhando com promises na prática

Na prática usamos promises para retorno de uma chamada de API, uma escrita ou leitura de arquivo assíncrona, uma consulta ao banco de dados utilizando JavaScript, enfim, são N situações, mas todas envolvem um retorno que é assíncrono.

Vamos utilizar a API do JSON Placeholder para buscarmos dados de forma assíncrona.

fetch('https://jsonplaceholder.typicode.com/users/1')
  .then(response => response.json())
  .then(user => console.log(user))
Enter fullscreen mode Exit fullscreen mode

image
É utilizado aqui a função fetch (nativa do JavaScript) para fazer a chamada para a API de usuários, o retorno dela é uma promise que ao ser resolvida (quando a chamada assíncrona terminar a execução) chamará a primeira instrução then que tem como função transformar a resposta em JSON, e passar o resultado como retorno para o próximo bloco then.
Sendo assim na segunda instrução then teremos o JSON com os dados de usuário sendo passados como parâmetro para ser utilizado dentro desta função, neste caso os dados são exibidos no console.

Tratando erros na Promise

fetch('https://jsonplaceholder.typicode.com/users/1')
  .then(response => response.json())
  .then(user => {
    if(user.id == 2)
        console.log(user)
    else
        throw new Error("Não é o usuário de ID 2") 
  }).catch((error) => console.log(error.message))
Enter fullscreen mode Exit fullscreen mode

image
Aqui fazemos a mesma chamada feita anteriormente buscando pelo usuário de id = 1, então dentro do bloco then é feita uma verificação em que caso o id seja 2 são exibidos os dados do usuário, caso contrário é lançada uma exceção, e esta é tratada no bloco catch, em que neste exemplo será exibida no console, mas em uma aplicação real geralmente seria neste ponto que ela seria enviada para o arquivo de log do sistema, ou apresentado algum tipo de mensagem para o usuário comunicando sobre o erro.

Considerações finais

Note que nesta forma de uso das promises temos a possibilidade de aninhar várias funções de callback para uma mesma promise, isso ajuda muito na questão de organização do código, pois de acordo com a arquitetura utilizada pode-se aplicar diferentes regras de negócio em cada bloco then.
Mas existe uma outra forma de tratar as promises que são utilizando os comandos async/await o qual falaremos em um próximo post.

Obrigado por ter lido até aqui, qualquer dúvida ou sugestão deixa aqui nos comentários. Um forte abraço!

Top comments (1)

Collapse
 
alexcvcoelho profile image
Alex Coelho

No problem with language. But i prefered write in this form because I hope that is more simple for understand. Thanks a lot for the tip!