0Pricing
Frontend Academy · Aula

Callbacks e callback hell

Entenda a programação assíncrona baseada em callbacks, identifique o problema de aninhamento conhecido como callback hell e veja por que Promises foram criadas para resolvê-lo.

Callbacks e callback hell é uma aula grátis de Frontend Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Frontend Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Frontend Academy inclui 4 aulas no total.

O que são funções de retorno?

Uma função de retorno é uma função passada como argumento para outra função, para ser chamada mais tarde, quando algum trabalho for concluído. As funções de retorno são o padrão assíncrono original do JavaScript — elas são anteriores às promessas.

// Synchronous callback:
[1, 2, 3].forEach(function(n) {
  console.log(n);
});

// Async callback:
setTimeout(function() {
  console.log('1 second later');
}, 1000);

Funções de retorno com erro primeiro no Node.js

Node.js padronizou uma convenção: as funções de retorno recebem um erro como primeiro argumento e o resultado como segundo. Se o primeiro argumento for null/undefined, a operação foi bem-sucedida.

fs.readFile('data.json', 'utf8', function(err, data) {
  if (err) {
    console.error('Failed to read file:', err);
    return;
  }
  console.log('File contents:', data);
});

Etapas assíncronas com funções de retorno

Quando uma operação assíncrona depende do resultado de outra, as funções de retorno são aninhadas. Três etapas sequenciais já começam a ficar confusas.

getUser(userId, function(err, user) {
  if (err) return handleError(err);
  getOrders(user.id, function(err, orders) {
    if (err) return handleError(err);
    getInvoice(orders[0].id, function(err, invoice) {
      if (err) return handleError(err);
      // Finally use invoice
      renderInvoice(invoice);
    });
  });
});

Inferno das funções de retorno — a pirâmide da perdição

O aninhamento profundo é chamado de inferno das funções de retorno ou pirâmide da perdição. Problemas: o código avança para a direita a cada nível, o tratamento de erros é repetitivo, o fluxo é difícil de acompanhar e a refatoração é trabalhosa.

Os problemas do inferno das funções de retorno

1) O tratamento de erros exige uma verificação explícita de erro em todos os níveis. 2) A depuração é difícil — os rastreamentos da pilha não mostram a cadeia lógica. 3) O código é difícil de ler organizado em camadas horizontais. 4) É fácil deixar erros passarem sem perceber.

Como reduzir o problema: funções nomeadas

Extraia as funções de retorno aninhadas para funções nomeadas no nível superior. Isso achata o aninhamento e permite testar cada etapa isoladamente — mas não resolve o problema fundamental de coordenação.

function onInvoice(err, invoice) {
  if (err) return handleError(err);
  renderInvoice(invoice);
}
function onOrders(err, orders) {
  if (err) return handleError(err);
  getInvoice(orders[0].id, onInvoice);
}
function onUser(err, user) {
  if (err) return handleError(err);
  getOrders(user.id, onOrders);
}
getUser(userId, onUser);

Bibliotecas de fluxo de controle (histórico)

Bibliotecas como async.js forneciam auxiliares (async.waterfall, async.parallel) para gerenciar fluxos baseados em funções de retorno. Elas eram o estado da arte antes da chegada das promessas no ES2015.

Por que as funções de retorno não vão desaparecer

As funções de retorno ainda aparecem em toda parte: ouvintes de eventos, métodos de array, setTimeout e APIs de fluxo usam funções de retorno. O ponto principal é que, para o sequenciamento assíncrono, as promessas e async/await são superiores. Funções de retorno para eventos simples que ocorrem uma vez continuam adequadas.

De função de retorno a promessa: promisificação

O util.promisify() do Node.js envolve funções de retorno com erro primeiro e as transforma em versões que retornam promessas. Isso conecta APIs legadas ao código moderno com async/await.

const { promisify } = require('util');
const readFile = promisify(require('fs').readFile);

async function readConfig() {
  const data = await readFile('config.json', 'utf8');
  return JSON.parse(data);
}

Quando as funções de retorno ainda são a ferramenta certa

Os ouvintes de eventos (addEventListener) esperam funções de retorno, e isso é adequado — eles são acionados várias vezes. Os manipuladores de dados de fluxos também esperam funções de retorno. Promessas são resultados assíncronos de uma única vez; funções de retorno são inscrições para vários eventos.

O caminho adiante: promessas e async/await

As promessas, introduzidas no ES2015, e async/await, introduzido no ES2017, resolveram o inferno das funções de retorno. O código moderno em JavaScript quase sempre usa async/await para operações assíncronas sequenciais. Entender as funções de retorno continua importante para ler código antigo e o funcionamento interno das bibliotecas.

Verificação rápida

Qual é o principal problema descrito por “inferno das funções de retorno”?

Recapitulação: funções de retorno

Funções de retorno são funções passadas para outras funções para serem chamadas mais tarde. Elas são o padrão assíncrono original. Funções de retorno com erro primeiro (erro, resultado) são uma convenção do Node.js. O aninhamento profundo cria o inferno das funções de retorno. Extraia funções nomeadas para achatar o aninhamento. Use promessas e async/await para fluxos assíncronos sequenciais. Funções de retorno continuam adequadas para ouvintes de eventos e fluxos.

Perguntas Frequentes

A aula “Callbacks e callback hell” é grátis?

Sim — o texto completo de “Callbacks e callback hell” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Frontend Academy, atualize para CoddyKit PRO. O curso de Frontend Academy inclui 4 aulas no total.

O que vou aprender em “Callbacks e callback hell”?

Entenda a programação assíncrona baseada em callbacks, identifique o problema de aninhamento conhecido como callback hell e veja por que Promises foram criadas para resolvê-lo. Você pratica Frontend Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Frontend Academy?

Nenhuma experiência prévia é necessária. Frontend Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Callbacks e callback hell”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Frontend Academy?

Sim. Cada aula de Frontend Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O loop de eventos: pilha de chamadas fila microtarefas
  2. Callbacks e callback hell
  3. Promises: then catch finally Promise.all
  4. async/await e tratamento de erros
← Voltar para Frontend Academy