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)

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)

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)

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))

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))

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!

18