Debounce do Zero em JavaScript: Otimizando Digitação em Tempo Real

Debounce do Zero em JavaScript: Otimizando Digitação em Tempo Real

O debounce é uma técnica essencial para adiar a execução de uma função até que um determinado período de inatividade tenha decorrido desde a sua última chamada. Essa abordagem resolve o problema de sobrecarga em APIs e travamentos de performance causados por disparos excessivos de eventos frequentes, como chamadas de busca ao digitar (input) ou redimensionamento de tela (resize).

JavaScript

// Função genérica de Debounce
function debounce(fn, delay = 300) {
  let timer;

  return function (...args) {
    // Cancela o agendamento anterior se uma nova chamada ocorrer dentro do intervalo
    clearTimeout(timer);

    // Agenda a execução da função callback após o tempo definido
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

// --- Exemplo de Uso Prático ---

// Função pesada que simula uma requisição de busca
function buscarResultados(termo) {
  console.log(`[API Request] Buscando por: "${termo}" às ${new Date().toLocaleTimeString()}`);
}

// Cria uma versão otimizada da função com espera de 500ms
const buscarComDebounce = debounce(buscarResultados, 500);

// Simulação de digitação rápida do usuário
console.log("Usuário começa a digitar...");
buscarComDebounce("J");
buscarComDebounce("Ja");
buscarComDebounce("Java");
buscarComDebounce("JavaScript"); 

// Apenas o último termo ("JavaScript") será processado após 500ms de pausa.
  • Uso de Closures e Timer: A função interna mantém a referência à variável timer mesmo após a execução de debounce(), garantindo o controle do ciclo de vida do temporizador entre chamadas consecutivas.
  • Uso de clearTimeout: Limpa o agendamento pendente toda vez que o evento dispara novamente antes do término do tempo limite (delay), reiniciando a contagem do zero.
  • Preservação de Contexto e Argumentos: O uso de fn.apply(this, args) garante que o this correto e todos os argumentos originais repassados à função empacotada sejam mantidos durante a execução do callback.
  • Parâmetro Default (delay): Definir um tempo de espera padrão (ex: 300ms a 500ms) garante uma boa experiência visual ao usuário sem comprometer a performance do servidor/navegador.
  • Pegadinha Comum: Lembre-se de não instanciar a função debounce dentro de handlers de eventos reativos (como componentes React sem useCallback), pois isso recriará o timer a cada renderização, anulando o efeito de retenção.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *