FNSP Web Page

Debounce e throttle: parecidos, e não são a mesma coisa

Duas técnicas para o mesmo problema — um evento que dispara vezes de mais — e que resolvem casos diferentes. Trocá-las dá sempre uma sensação estranha na interface.

  • Debounce: espera que pare. Só executa quando as coisas acalmam.

  • Throttle: executa durante, mas no máximo uma vez a cada X.

1. Debounce: para o que só interessa no fim

function debounce(funcao, espera = 300) {
  let temporizador;
  return (...args) => {
    clearTimeout(temporizador);
    temporizador = setTimeout(() => funcao(...args), espera);
  };
}

// Procurar enquanto se escreve: só quando a pessoa parar de escrever
campo.addEventListener('input', debounce((evento) => {
  procurar(evento.target.value);
}, 300));

Escrever "javascript" são dez teclas. Sem debounce, dez pedidos ao servidor — e o resultado de "javascr" pode chegar depois do de "javascript" e escrever por cima dele.

2. Throttle: para o que tem de acompanhar

function throttle(funcao, intervalo = 200) {
  let ultima = 0;
  return (...args) => {
    const agora = Date.now();
    if (agora - ultima < intervalo) return;
    ultima = agora;
    funcao(...args);
  };
}

// Barra de progresso do scroll: tem de mexer enquanto se desliza
window.addEventListener('scroll', throttle(() => {
  actualizarBarraDeProgresso();
}, 100));

Com debounce, a barra só mexia quando a pessoa parasse — inútil.

3. Como escolher, numa pergunta

Interessa-me o resultado enquanto a coisa acontece, ou só no fim?

  • Guardar um rascunho enquanto se escreve → debounce.

  • Validar um campo depois de escrever → debounce.

  • Mostrar a posição do rato → throttle.

  • Recalcular um layout ao redimensionar → throttle.

4. Antes de escrever isto à mão

Para saber se algo está visível, o IntersectionObserver é melhor do que qualquer throttle no scroll. Para reagir a mudanças de tamanho, existe o ResizeObserver. E para animações ligadas ao scroll, o requestAnimationFrame sincroniza com o desenho do browser em vez de adivinhar um intervalo.

O debounce e o throttle continuam a ser as ferramentas certas para o resto — a começar pela caixa de pesquisa.

Comentários

Ainda ninguém comentou este artigo.

Voltar ao blog

Gostávamos de saber quantas pessoas visitam o site, com o Google Analytics. Sem a sua autorização não corre nada. Política de Privacidade.