JavaScript Academy · Oppitunti

Debounce ja throttle — toteutus itse

Rakenna pienet debounce- ja throttle-apufunktiot. Harjoittele trailing- ja leading-versioita ja opi, milloin kumpaakin kannattaa käyttää

Oppitunti 2/38 vaihetta

Debounce ja throttle — toteutus itse on ilmainen JavaScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/3. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu JavaScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. JavaScript Academy-kurssilla on yhteensä 3 oppituntia.

Yleiskatsaus

Tavoite: Hallitkaa usein toistuvia tapahtumia.

  • Debounce: odotetaan tapahtumien hiljentymistä ja suoritetaan sitten kerran
  • Throttle: suoritetaan enintään kerran aikavälissä
  • Leading- ja trailing-kutsut
  • Pienet, selkeät apufunktiot
Debounce ja throttle — toteutus itse — kuvitus 1

Debounce (trailing)

Trailing debounce nollaa ajastimen jokaisen tapahtuman yhteydessä ja suoritetaan kerran, kun tapahtumat rauhoittuvat.

// 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 ja throttle — toteutus itse — kuvitus 2

Debounce (leading)

Leading debounce suoritetaan heti ja estää sitten toistot, kunnes hiljainen jakso päättyy.

// 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 ja throttle — toteutus itse — kuvitus 3

Throttle (leading)

Throttle rajoittaa kutsut yhteen kussakin aikavälissä ja jättää ylimääräiset kutsut pois.

// 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 ja throttle — toteutus itse — kuvitus 4

Throttle (trailing)

Trailing throttle varmistaa, että saatte silti viimeisimmän arvon aikavälin lopussa.

// 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 ja throttle — toteutus itse — kuvitus 5

Milloin kumpaa käytetään?

Valinta:

  • Debounce: kirjoittamisen aikainen haku ja koon muuttaminen — suorittakaa kun käyttäjä on lopettanut.
  • Throttle: vieritys ja raahaus — rajoittakaa kutsut tasaiseen tahtiin.
  • Käyttäkää leading-vaihtoehtoa välitöntä palautetta varten ja trailing-vaihtoehtoa viimeisen arvon tallentamiseen.
Debounce ja throttle — toteutus itse — kuvitus 6

Debounce vai throttle -koe

Pikatarkistus: Kutsujen rajoittaminen aikavälissä.

Debounce ja throttle — toteutus itse — kuvitus 7

Kertaus

Kertaus: Kirjoititte trailing- ja leading-debouncen, yksinkertaisen leading-throttlen ja kevyen trailing-throttlen. Valitkaa debounce, kun haluatte suorittaa toiminnon käyttäjän lopetettua, ja throttle, kun haluatte tasaisen rytmin.

Debounce ja throttle — toteutus itse — kuvitus 8
Aloita maksutta

Opi JavaScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
59
Oppitunnit
200

Usein kysytyt kysymykset

Onko oppitunti ”Debounce ja throttle — toteutus itse” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa JavaScript Academy-oppimispolun 3 oppituntia, myös oppitunnin “Debounce ja throttle — toteutus itse”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. JavaScript Academy-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”Debounce ja throttle — toteutus itse”?

Rakenna pienet debounce- ja throttle-apufunktiot. Harjoittele trailing- ja leading-versioita ja opi, milloin kumpaakin kannattaa käyttää Harjoittelet JavaScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni JavaScript Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin JavaScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/3.

Kuinka kauan ”Debounce ja throttle — toteutus itse”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä JavaScript Academy-oppitunnilla?

Kyllä. Jokainen JavaScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. setTimeout, setInterval ja ajastinten ajautuminen
  2. Debounce ja throttle — toteutus itse
  3. Animaation ajoitus — johdatus aikaperustaisiin silmukoihin
← Takaisin: JavaScript Academy