0Pricing
JavaScript Academy · Aula

Debounce versus throttle — implementados manualmente

Crie pequenos utilitários de debounce e throttle. Pratique as variantes com execução no início e no fim e saiba quando escolher cada uma

Debounce versus throttle — implementados manualmente é uma aula grátis de JavaScript Academy no CoddyKit. Esta é a aula 2 de 3. 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 JavaScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de JavaScript Academy inclui 3 aulas no total.

Visão geral

Objetivo: Controlar eventos ruidosos.

  • Adiamento: aguardar o silêncio e executar uma vez
  • Limitação: executar no máximo uma vez por intervalo
  • Chamadas iniciais e posteriores
  • Auxiliares pequenos e legíveis
Debounce versus throttle — implementados manualmente — ilustração 1

Adiamento (posterior)

O adiamento posterior reinicia um temporizador a cada evento e executa uma vez quando tudo se acalma.

// Debounce (trailing): run once after events stop
function debounce(fn, wait) {
  let t = null;
  return function (...args) {
    clearTimeout(t);
    t = setTimeout(function () {
      fn.apply(null, args);
    }, wait);
  };
}

// Simulate rapid events: only the last triggers the call
const debouncedLog = debounce(function (msg) {
  console.log("debounced:", msg);
}, 10);

for (let i = 0; i < 5; i++) {
  setTimeout(function () {
    debouncedLog("final after bursts");
  }, i * 3);
}
Debounce versus throttle — implementados manualmente — ilustração 2

Adiamento (inicial)

O adiamento inicial é disparado imediatamente e depois bloqueia repetições até o fim do período de silêncio.

// Debounce (leading): first call fires immediately, then ignore until quiet
function debounceLeading(fn, wait) {
  let t = null;
  return function (...args) {
    if (t === null) {
      fn.apply(null, args);
    }
    clearTimeout(t);
    t = setTimeout(function () {
      t = null;
    }, wait);
  };
}

// Demo: first call prints quickly; later bursts are ignored until quiet
const firstTap = debounceLeading(function (x) {
  console.log("leading:", x);
}, 12);

for (let i = 0; i < 4; i++) {
  setTimeout(function () {
    firstTap("first-then-wait");
  }, i * 3);
}
Debounce versus throttle — implementados manualmente — ilustração 3

Limitação (inicial)

A limitação restringe as chamadas a uma por janela de tempo, descartando as excedentes.

// Throttle (leading): at most once per interval
function throttle(fn, wait) {
  let last = 0;
  return function (...args) {
    const now = Date.now();
    if (now - last >= wait) {
      last = now;
      fn.apply(null, args);
    }
  };
}

// Demo: many events, but prints at most once every 10ms
const throttled = throttle(function (n) {
  console.log("throttled:", n);
}, 10);

for (let i = 0; i < 10; i++) {
  setTimeout(function () {
    throttled(i);
  }, i * 2);
}
Debounce versus throttle — implementados manualmente — ilustração 4

Limitação (posterior)

A limitação posterior garante que você ainda receba o valor mais recente ao fim da janela.

// Throttle (trailing): schedule the last call within the window
function throttleTrailing(fn, wait) {
  let last = 0;
  let timer = null;
  let queuedArgs = null;

  function invoke(args) {
    last = Date.now();
    fn.apply(null, args);
  }

  return function (...args) {
    const now = Date.now();
    const remaining = wait - (now - last);

    if (remaining <= 0) {
      // Window passed: run now
      clearTimeout(timer);
      timer = null;
      queuedArgs = null;
      invoke(args);
    } else {
      // Queue the latest args to run at the end of the window
      queuedArgs = args;
      clearTimeout(timer);
      timer = setTimeout(function () {
        timer = null;
        if (queuedArgs) {
          invoke(queuedArgs);
          queuedArgs = null;
        }
      }, remaining);
    }
  };
}

// Demo: last value in a burst is printed after the window
const trail = throttleTrailing(function (x) {
  console.log("trail:", x);
}, 10);

for (let i = 0; i < 6; i++) {
  setTimeout(function () {
    trail("v" + i);
  }, i * 3);
}
Debounce versus throttle — implementados manualmente — ilustração 5

Quando usar cada uma?

Escolha:

  • Adiamento: pesquisa conforme você digita, redimensionamento — execute depois que o usuário parar.
  • Limitação: rolagem/arraste — limite as chamadas a um ritmo constante.
  • Inicial para resposta imediata; posterior para capturar o valor final.
Debounce versus throttle — implementados manualmente — ilustração 6

Questionário sobre adiamento e limitação

Verificação rápida: Limitar chamadas por janela.

Debounce versus throttle — implementados manualmente — ilustração 7

Recapitulação

Recapitulação: Você escreveu adiamentos posteriores e iniciais, uma limitação inicial simples e uma limitação posterior leve. Escolha o adiamento para “depois que o usuário parar” e a limitação para “ritmo constante”.

Debounce versus throttle — implementados manualmente — ilustração 8

Perguntas Frequentes

A aula “Debounce versus throttle — implementados manualmente” é grátis?

Sim — o texto completo de “Debounce versus throttle — implementados manualmente” é 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 JavaScript Academy, atualize para CoddyKit PRO. O curso de JavaScript Academy inclui 3 aulas no total.

O que vou aprender em “Debounce versus throttle — implementados manualmente”?

Crie pequenos utilitários de debounce e throttle. Pratique as variantes com execução no início e no fim e saiba quando escolher cada uma Você pratica JavaScript 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 JavaScript Academy?

Nenhuma experiência prévia é necessária. JavaScript 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 3.

Quanto tempo leva a aula “Debounce versus throttle — implementados manualmente”?

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 JavaScript Academy?

Sim. Cada aula de JavaScript 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. setTimeout, setInterval e desvio dos temporizadores
  2. Debounce versus throttle — implementados manualmente
  3. Temporização de animações — introdução a loops baseados em tempo
← Voltar para JavaScript Academy