setTimeout, setInterval i dryf czasomierza
Planowanie jednorazowych i cyklicznych zadań za pomocą setTimeout/setInterval oraz poznanie prostej techniki ograniczania dryfu czasomierza
setTimeout, setInterval i dryf czasomierza to bezpłatna lekcja JavaScript Academy na CoddyKit. To lekcja 1 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej JavaScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs JavaScript Academy zawiera 3 lekcji w sumie.
Wprowadzenie do timerów
Cel: przejrzyście planować wykonywanie zadań.
- setTimeout: uruchamia później (jednorazowo)
- setInterval: uruchamia wielokrotnie
- Dryf: dlaczego timery się opóźniają
- Proste rozwiązanie problemu dryfu

setTimeout — jednorazowe wykonanie
setTimeout(fn, ms) uruchamia funkcję raz po upływie opóźnienia (jest to minimalny czas, a nie wartość dokładna).
// setTimeout schedules a one-off callback
console.log("A: start");
setTimeout(function () {
console.log("B: after ~5ms");
}, 5);
console.log("C: scheduled");

setInterval — powtarzanie
setInterval automatycznie powtarza wykonanie; aby je zatrzymać, należy użyć clearInterval(id).
// setInterval repeats; always clear it
let count = 0;
const id = setInterval(function () {
count = count + 1;
console.log("tick", count);
// Stop after 3 ticks to avoid endless logs
if (count >= 3) {
clearInterval(id);
console.log("stopped");
}
}, 5);

Obserwowanie dryfu
Rzeczywiste odstępy czasowe się różnią; przyczyną dryfu są wykonywana praca, obciążenie urządzenia i pętla zdarzeń.
// Drift demo: expected vs actual timing
const targetMs = 5;
let last = Date.now();
let times = 0;
const driftId = setInterval(function () {
const now = Date.now();
const gap = now - last; // actual gap
last = now;
times = times + 1;
console.log("gap~", gap, "ms");
if (times >= 3) {
clearInterval(driftId);
console.log("done");
}
}, targetMs);

Wyrównane planowanie
Należy wyrównywać wykonanie względem zmiennego czasu expected: obliczać kolejne opóźnienie na jego podstawie, aby uniknąć narastania błędu.
// Simple drift fix: schedule from the expected time
const step = 5;
let expected = Date.now() + step;
let ticks = 0;
function tick() {
ticks = ticks + 1;
const now = Date.now();
const drift = now - expected; // positive if we are late
console.log("drift:", drift, "ms");
// Compute next expected time first
expected = expected + step;
// Next delay = time until the next expected timestamp
const nextDelay = Math.max(0, expected - Date.now());
if (ticks < 3) {
setTimeout(tick, nextDelay);
} else {
console.log("aligned stop");
}
}
setTimeout(tick, step);

Wskazówki i lista kontrolna
Wskazówki:
- Po zakończeniu zawsze należy wywołać clearInterval.
- W przypadku stałego rytmu warto preferować wyrównane pętle z użyciem setTimeout.
- Wywołania zwrotne timerów powinny być krótkie, aby ograniczyć dryf.

Quiz z rozwiązania problemu dryfu
Szybkie sprawdzenie: ograniczanie dryfu.

Podsumowanie
Podsumowanie: używano setTimeout do wykonań jednorazowych i setInterval do powtórzeń (pamiętając o jego wyczyszczeniu), a także ograniczano dryf przez wyrównywanie kolejnych uruchomień względem oczekiwanych czasów.

Często zadawane pytania
Czy lekcja „setTimeout, setInterval i dryf czasomierza” jest bezpłatna?
Tak — pełny tekst „setTimeout, setInterval i dryf czasomierza” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu JavaScript Academy, przejdź na CoddyKit PRO. Kurs JavaScript Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „setTimeout, setInterval i dryf czasomierza”?
Planowanie jednorazowych i cyklicznych zadań za pomocą setTimeout/setInterval oraz poznanie prostej techniki ograniczania dryfu czasomierza Ćwiczysz JavaScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć JavaScript Academy?
Nie wymagamy żadnego doświadczenia. JavaScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 3.
Ile czasu zajmuje lekcja „setTimeout, setInterval i dryf czasomierza”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji JavaScript Academy?
Tak. Każda lekcja JavaScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- setTimeout, setInterval i dryf czasomierza
- Debounce a throttle — implementacja od podstaw
- Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu