Promises em JavaScript – Aplicações em ES6 e Angularjs

Introdução

Antes de mais nada, vamos falar sobre Promises em JavaScript. Elas são uma das características mais importantes da programação moderna, especialmente no contexto do ES6 e do AngularJS. A princípio, as Promises (promessas) ajudam a gerenciar operações assíncronas de maneira mais clara e eficiente. Além disso, seu uso se tornou indispensável para lidar com requisições a APIs e outros processos que exigem um tempo de resposta.

O que são Promises?

Primeiramente, é essencial entender o conceito de Promises. Uma promessa é um objeto que representa a eventual conclusão (ou falha) de uma operação assíncrona. Em outras palavras, é uma maneira de lidar com valores que ainda não estão disponíveis.

Estados das Promises

Acima de tudo, as Promises têm três estados:

  1. Pending (Pendente): Estado inicial, quando a Promises ainda não foi concluída.
  2. Fulfilled (Cumprida): Quando a operação foi concluída com sucesso.
  3. Rejected (Rejeitada): Quando a operação falhou.

Como Criar uma Promessa

Em primeiro lugar, vamos ver como criar uma promessa em JavaScript. Para isso, utilizamos o construtor Promise.

const minhaPromessa = new Promise((resolve, reject) => {
    // operação assíncrona
});

Exemplo Prático de Promessa

Além disso, vejamos um exemplo prático:

const minhaPromessa = new Promise((resolve, reject) => {
    const sucesso = true; // Simulação de sucesso
    if (sucesso) {
        resolve("Operação realizada com sucesso!");
    } else {
        reject("Falha na operação.");
    }
});

minhaPromessa
    .then(resposta => console.log(resposta))
    .catch(erro => console.error(erro));

Usando Promises com Fetch

Contudo, um dos casos de uso mais comuns é com a API Fetch. Essa API permite realizar requisições HTTP de forma assíncrona.

Exemplo com Fetch

Sobretudo, aqui está um exemplo de como usar Promises com Fetch:

fetch('https://api.exemplo.com/dados')
    .then(response => response.json())
    .then(dados => console.log(dados))
    .catch(erro => console.error("Erro ao buscar os dados:", erro));

Encadeamento de Promises

Juntamente com o uso básico, o encadeamento de Promessas é uma técnica poderosa. Isso permite que você execute várias operações assíncronas em sequência.

Como Funciona?

Ou seja, você pode chamar .then() múltiplas vezes:

minhaPromessa
    .then(resposta => {
        console.log(resposta);
        return "Próxima operação";
    })
    .then(novaResposta => console.log(novaResposta))
    .catch(erro => console.error(erro));

Erros Comuns ao Usar Promessas

Todavia, mesmo que as promessas sejam uma ferramenta incrível, alguns erros podem ocorrer. Aqui estão alguns dos mais comuns:

  1. Não retornar uma promessa: Ao usar .then(), é crucial retornar outra promessa, caso contrário, o encadeamento não funcionará corretamente.
  2. Não tratar erros: Sempre use .catch() para lidar com erros, mesmo que não espere falhas.

Async/Await: Uma Alternativa

Primeiramente, uma alternativa ao uso tradicional é o async/await, introduzido no ES2017. Essa abordagem simplifica o código assíncrono.

Exemplo de Async/Await

Por exemplo:

const obterDados = async () => {
    try {
        const resposta = await fetch('https://api.exemplo.com/dados');
        const dados = await resposta.json();
        console.log(dados);
    } catch (erro) {
        console.error("Erro ao buscar os dados:", erro);
    }
};

obterDados();

Promises em AngularJS

Acima de tudo, AngularJS utiliza promessas de forma nativa com seu serviço $q. Isso torna o manuseio de requisições assíncronas ainda mais fácil.

Uso do Serviço $q

Principalmente, o serviço $q permite criar uma Promise em seus controladores e serviços.

app.controller('MeuController', function($scope, $q) {
    const minhaPromessa = $q((resolve, reject) => {
        // operação assíncrona
    });

    minhaPromessa.then(resposta => {
        $scope.mensagem = resposta;
    }).catch(erro => {
        console.error(erro);
    });
});

Vantagens das Promises

Em suma, as promessas oferecem várias vantagens:

  1. Código mais limpo: Elas evitam o “callback hell”.
  2. Manejo de erros: Através do método .catch(), é mais fácil lidar com erros.
  3. Facilidade de encadeamento: É simples executar múltiplas operações assíncronas em sequência.

Conclusão

Portanto, as Promises em JavaScript são fundamentais para o desenvolvimento de aplicações modernas. Além disso, sua aplicação em ES6 e AngularJS torna o processo de manipulação de operações assíncronas muito mais eficaz. Em suma, dominar esse conceito é essencial para qualquer desenvolvedor que deseje criar aplicações robustas e escaláveis.

Perguntas Frequentes

O que é uma Promise em JavaScript?

Uma Promise é um objeto que representa a eventual conclusão ou falha de uma operação assíncrona.

Como posso lidar com erros em Promise?

Você pode usar o método .catch() para capturar e tratar erros de uma Promise.

Qual a diferença entre Promises e async/await?

As Promises são uma forma de lidar com operações assíncronas, enquanto async/await é uma sintaxe que simplifica o uso de Promises.

Promessas em JavaScript - Aplicações em ES6 e Angularjs
Prof. Eduardo H Gomes
Prof. Eduardo H Gomes

Mestre em Engenharia da Informação, Especialista em Engenharia da Computação, Cientista da Computação, Professor de Inteligência Artificial no IFSP, 18 anos de docência no Ensino Superior. Apaixonado por Surf, Paraglider, Mergulho livre, Tecnologia, SEO, Banco de Dados e Desenvolvimento Web.