Entendendo Promises, Async e Await em JavaScript

Operações assíncronas baseadas em Promises podem ser escirtas de forma tradciional. Exemplo:

function esperar(tempo) {
  return new Promise((resolver) => {
    setTimeout(() => {
      console.log('-- dentro do setTimeout --', tempo);
      resolver(tempo);
    }, tempo);
  });
}

function executar(entrada, tempo) {
  console.log('início');
  esperar(tempo).then((resultado) => {
    console.log(entrada, 'valor de entrada', resultado, 'resultado');
    console.log('fim');
  });
}

executar('parâmetro', 1500);

Essa mesma lógica pode ser simplificada com async/await:

async function esperar(tempo) {
  await new Promise((resolver) => {
    setTimeout(() => {
      console.log('-- dentro do setTimeout --', tempo);
      resolver(tempo);
    }, tempo);
  });
}

async function executar(entrada, tempo) {
  console.log('início');
  const resultado = await esperar(tempo);
  console.log(entrada, 'valor de entrada', resultado, 'resultado');
  console.log('fim');
}

executar('parâmetro', 1500);

Quando a Promise preecisa entrar no estado de rejeição (reject), a versão tradicional utiliza catch:

function esperar(tempo) {
  return new Promise((resolver, rejeitar) => {
    const condicao = false;
    setTimeout(() => {
      console.log('-- dentro do setTimeout --', tempo);
      if (condicao) {
        resolver();
      } else {
        rejeitar('Erro: algo deu errado');
      }
    }, tempo);
  });
}

function executar(entrada, tempo) {
  console.log('início');
  esperar(tempo)
    .then(() => {
      console.log(entrada, 'valor de entrada');
      console.log('fim');
    })
    .catch((erro) => {
      console.log(erro);
    });
}

executar('parâmetro', 1500);

Com async/await, é possível capturar rejeições usando try/catch ou encadeando .catch() ao await:

async function esperar(tempo) {
  await new Promise((resolver, rejeitar) => {
    const condicao = false;
    setTimeout(() => {
      console.log('-- dentro do setTimeout --', tempo);
      if (condicao) {
        resolver();
      } else {
        rejeitar('Erro: algo deu errado');
      }
    }, tempo);
  });
}

// Usando try/catch:
async function executar(entrada, tempo) {
  try {
    console.log('início');
    await esperar(tempo);
    console.log(entrada, 'valor de entrada');
    console.log('fim');
  } catch (erro) {
    console.log(erro);
  }
}

// Ou capturando diretamente com .catch():
async function executar2(entrada, tempo) {
  console.log('início');
  await esperar(tempo).catch((erro) => console.log(erro));
  console.log(entrada, 'valor de entrada');
  console.log('fim');
}

executar('parâmetro', 1500);

Saída esperada:

início
-- dentro do setTimeout --, 1500
Erro: algo deu errado

Tags: javascript promises Async/Await Assincronismo

Publicado em 6-24 04:00