Callbacks: o jeito 'antigo' de lidar com assincronicidade

Relembre os callbacks e como eles foram usados para gerenciar tarefas assíncronas.

Antes de Promise e async/await, a forma mais comum de lidar com tarefas assíncronas no JavaScript era usar callbacks.

O que é callback?

Callback é, basicamente, uma função passada como argumento para outra função, para ser executada depois.

Analogia simples:
é como deixar seu número na fila da padaria e dizer:
"quando meu pedido ficar pronto, me chama".


Exemplo simples (síncrono)

function saudacao(nome, callback) {
  console.log("Olá, " + nome);
  callback();
}

function despedida() {
  console.log("Até mais!");
}

saudacao("Ana", despedida);

Aqui, despedida é um callback.


Exemplo assíncrono com setTimeout

console.log("início");

setTimeout(function () {
  console.log("tarefa concluída depois de 2 segundos");
}, 2000);

console.log("fim");

A função dentro de setTimeout é um callback que roda depois do tempo definido.


Callback em eventos (muito comum)

const botao = document.getElementById("btn");

botao.addEventListener("click", function () {
  console.log("você clicou");
});

A função passada para addEventListener também é callback.


Problema clássico: callback hell

Quando você precisa encadear várias operações assíncronas com callbacks, o código pode ficar muito "aninhado" (um dentro do outro).

tarefa1(function () {
  tarefa2(function () {
    tarefa3(function () {
      console.log("tudo pronto");
    });
  });
});

Esse formato pode dificultar leitura, manutenção e tratamento de erros.


Tratando erro com callback (padrão comum)

Em Node.js, ficou famoso o padrão error-first callback:

function buscarDados(callback) {
  const deuErro = false;

  if (deuErro) {
    callback("erro ao buscar dados", null);
  } else {
    callback(null, { nome: "maria" });
  }
}

buscarDados(function (erro, dados) {
  if (erro) {
    console.log("falha:", erro);
    return;
  }

  console.log("sucesso:", dados);
});
  • primeiro parâmetro: erro
  • segundo parâmetro: resultado

Quando callbacks ainda são úteis?

Mesmo com Promise e async/await, callbacks ainda aparecem em:

  • eventos (addEventListener)
  • temporizadores (setTimeout, setInterval)
  • algumas bibliotecas antigas

Resumo da lição

  • callback é uma função passada para ser executada depois.
  • foi a forma principal de lidar com assincronicidade por muito tempo.
  • funciona, mas pode ficar confuso em fluxos grandes (callback hell).
  • entender callbacks é essencial para compreender a evolução para Promises e async/await.