Async/Await try-catch Infernal

Capa do informativo Async/Await try-catch Infernal

Async/Await parece ótimo porque evita o inferno do calback ou a pirâmide do terror por escrever um código assíncrono linha por linha de forma limpa.

Neste post vou demonstrar através de exemplos o que é este inferno de callback, e algumas formas de tratar erros em métodos assíncronos.

Exemplo do callback hell

function hell() { step1((a) => { step2((b) => { step3((c) => { //Bem Vindo }); }); }); }

Exemplo de código assíncrono.

function heaven(){ const a = await step1(); const b = await step2(); const c = await step3(); return a + b + c; }

Isto é… Até tivermos que lidar com tratamento de erros… Porque você pode acabar caindo na torre do terror do try catch, transformando seu código simples e limpo de linhas únicas em no mínimo mais 6 linhas de código.

Exemplo da torre do terror (tower of terror)

async function towerOfTerror() { let a; let b; let c; try { a = await step1(); } catch (error) { handle(error); } try { b = await step2(); } catch (error) { handle(error); } try { c = await step3(); } catch (error) { handle(error); } return a + b + c; }

Nesses casos, a solução mais simples é simplesmente usar o catch no final de cada promise criada.

await step1().catch(fun);

Algo como:

function gettingBetter(){ const a = await step1().catch(err => { handle(err) }); const b = await step2().catch(err => { handle(err) }); const c = await step3().catch(err => { handle(err) }); return a + b + c; }

O que até que fica melhor porém ainda é repetitivo, uma outra opção é criar uma funcão onde exista apenas um bloco try catch para substituir todas as outras, como a seguir:

async function awessome() { try { const data = await promise; return [data, null]; } catch (error) { console.error(error); return [null, error]; } }

Assim quando a promessa for resolvida, ela devolverá um array com sua resposta e nulo se não houver erros, e se conter erros retornará um array com o primeiro índice nulo e o erro, assim podemos manter o código limpo linha por linha usando desestruturação e usar um if caso queira fazer outra coisa com o erro.

async function main() { const [data, error] = await awessome(); if (error) { } const [data2, error2] = await awessome(); const [data3, error3] = await awessome(); return a + b + c; }

Referência: Fireship

28/07/2021 15:02

Imagem de perfil

Oi, me chamo Jorge

Proprietário deste site e desenvolvedor fullstack focado em tecnologias para a web :)

Me encontre nas redes sociais

Tenho certeza que tem ideias para discutir.

Ícone do telegramÍcone do githubÍcone do emailÍcone do instagramÍcone do linkedinÍcone do Twitter