O que é um Callback? Uma função passada para ser chamada depois
Um callback é uma função que você passa para outro código para que esse código possa chamá-la de volta depois, comumente quando um evento acontece ou uma tarefa assíncrona completa.
Callbacks são uma das formas mais antigas de tratar "faça isto quando aquilo terminar". Você entrega uma função a uma API; a API a segura e a invoca no momento certo, como quando dados chegam ou um timer dispara. Callbacks são simples e estão em toda parte, mas aninhar muitos deles leva ao estilo emaranhado frequentemente chamado de "callback hell".
O que faz um callback
Um callback é apenas uma função usada como valor: passada como argumento para ser invocada depois. O código receptor decide quando e com quais argumentos chamá-la. Isso inverte o controle: você fornece o comportamento, o framework decide o timing.
Onde callbacks aparecem
- Event handlers, como um clique ou uma mensagem recebida.
- Conclusão de I/O assíncrono, como uma leitura de arquivo terminando.
- Higher-order functions como map, filter e reduce.
- Timers e escalonamento, como setTimeout e setInterval.
Callback hell
Quando um passo async depende do resultado de outro, callbacks aninham dentro de callbacks, aprofundando a cada passo. O código deriva para a direita e fica difícil de ler e de tratar erros. Promises e async/await foram criados em grande parte para achatar isso.
Tratamento de erros com callbacks
Uma convenção comum passa um erro como o primeiro argumento do callback (o padrão "error-first"). Funciona, mas é fácil de errar: esqueça de verificar o erro e uma falha passa silenciosamente, o que é uma das razões pelas quais promises assumiram o lugar.
Um exemplo rápido
Em arr.forEach(item => console.log(item)), a arrow function é um callback: forEach a chama uma vez por elemento, e você nunca a chama diretamente.
Callbacks no CI
Testes que dependem de um callback disparar podem travar ou ficar flaky se o callback nunca roda ou roda depois do assert. Esses bugs de timing falham de forma intermitente em runners ocupados. A Latchkey dá retry automático em falhas transitórias enquanto você estabiliza testes movidos por callbacks, para que uma execução flaky não bloqueie um merge.
Principais conclusões
- Um callback é uma função passada para outro código para ser invocada depois.
- É a base do tratamento de eventos e do async antigo, mas aninhar causa callback hell.
- Promises e async/await substituíram em grande parte cadeias profundas de callbacks.