1
resposta

Entendi as promessas em si, mas não ao certo o objeto Promise (new Promise)

Alguém pode me explicar a diferença dentre usar o new Promise() e o .then/.catch ou await/async?

1 resposta

Li uma vez que Promises e Observables são amaldiçoadas, uma vez que você aprende você é amaldiçoado a não conseguir explicar, mas vou tentar não falar nenhuma besteira kk.

Em 90% dos casos, você vai se deparar com uma Promise quando estiver consumido APIs.

Por exemplo, se você precisar consultar os dados de um CEP através de uma API de consulta, você sem dúvidas vai querer que seu código espere a requisição ser finalizada, para então você poder trabalhar com os dados consultados.

Quando você executa o seu arquivo javascript, os comandos são executados de forma tão veloz que não dá tempo da requisição ser finalizada em tempo hábil.

Trabalhar com Promises permite que você faça a execução do seu código "esperar" até que a Promise retorne um sucesso ou falha.

Async await somente funcionam com Promises, e é uma forma explícita de você criar funções que vão esperar uma promise ser concluída.

Utilizar o then( ) e catch() são formas de você manipular os resultados da Promises, mas você também pode utilizar o bloco try catch, cercando a chamada da Promise.

Bibliotecas como o axios já retornam uma Promise quando você faz uma requisição, segue abaixo um exemplo:

import axios from 'axios';

const URL_CONSULTA_CEP = `https://brasilapi.com.br/api/cep/v1/`;

// =================== //
// Utilizando o then() //
// =================== //
consultarCEP(20020030).then(
  (sucesso) => {
    console.log(`# Consulta realizada - Resultado capturado pelo then():`);
    console.log(sucesso.data);
  }
).catch(
  (error) => {
    console.log(`# Ocorreu um erro durante a consulta:`);
    console.error(error) 
  }
);

// ====================== //
// Utilizando o try catch //
// ====================== //
try {
  const consulta = await consultarCEP(20020030);
  console.log(`# Consulta realizada - Resultado capturado pelo try():`);
  console.log(consulta.data);

} catch(error) {
  console.log(`# Ocorreu um erro durante a consulta:`);
  console.log(error);
}

async function consultarCEP(numeroCEP) {
  return await axios.get(`${URL_CONSULTA_CEP}${numeroCEP}`);
}

Resultados:

$ node index.js
# Consulta realizada - Resultado capturado pelo try():
{
  cep: '20020030',
  state: 'RJ',
  city: 'Rio de Janeiro',
  neighborhood: 'Centro',
  street: 'Praça Academia',
  service: 'correios'
}
# Consulta realizada - Resultado capturado pelo then():
{
  cep: '20020030',
  state: 'RJ',
  city: 'Rio de Janeiro',
  neighborhood: 'Centro',
  street: 'Praça Academia',
  service: 'correios'
}

No caso de você querer criar uma Promise, bem é simples, quando você instancia o objeto ele pode receber dois parâmetros principais: 1º Parâmetro: Callback de sucesso da sua Promise (basicamente o retorno de sucesso); 2º Parâmetro: Callback de falha da sua Promise (retorna o erro que gerou);

const teste = new Promise((sucesso, falha) => {
    if(true) {
        sucesso("Aqui retorno o sucesso da minha promise.");
    } else {
        falha("Aqui retorno o não sucesso da minha promise");
    }
});

teste.then(s => console.log(s));
// retorno: Aqui retorno o sucesso da minha promise.