PorównaniePorównania

setTimeout() vs setInterval()

setTimeout() wywołuje funkcję jeden raz po określonym czasie, a setInterval() wywołuje ją cyklicznie, aż zatrzymasz je przez clearInterval().

Na tej stronie

Porównanie w tabeli

#

Przykład

#
JavaScript
console.log('Start')

const timer = setInterval(() => console.log('Interval tick'), 200)

setTimeout(() => {
  clearInterval(timer)
  console.log('Timeout po 500 ms, interwał zatrzymany')
}, 500)
Konsola
Start
Interval tick
Interval tick
Timeout po 500 ms, interwał zatrzymany

Definicja i zastosowanie

#

Obie funkcje planują wywołanie callbacku po podanej liczbie milisekund i nie blokują reszty kodu, który wykona się dalej od razu. Obie zwracają identyfikator, który przekazujesz do odpowiedniej funkcji czyszczącej, żeby odwołać zaplanowane wywołanie. Podany czas to tylko minimalne opóźnienie, nie gwarancja dokładności.

setTimeout() wywołuje funkcję jeden raz i kończy działanie. setInterval() wywołuje ją wielokrotnie, co ten sam odstęp, aż do wywołania clearInterval(), przy czym pierwsze wywołanie następuje też po pierwszym odstępie, nie od razu. Zapomniany interwał pracuje w nieskończoność, nawet gdy nikt już nie potrzebuje jego wyników, co jest częstą przyczyną wycieków pamięci. Gdy pojedyncze wywołanie może trwać dłużej niż odstęp, na przykład zapytanie do serwera, bezpieczniejszy jest samo-planujący się łańcuch setTimeout().

Do jednorazowego opóźnienia i do mechanizmów typu debounce używaj setTimeout(). Do prostego, stałego powtarzania, jak odliczanie czasu, setInterval() wystarczy, ale pamiętaj o clearInterval(), gdy przestaje być potrzebny.

Składnia

#
Składnia
const timeoutId = setTimeout(callback, delay)
const intervalId = setInterval(callback, delay)

Więcej przykładów

#
Zliczanie wywołań interwału
JavaScript
let calls = 0

const id = setInterval(() => {
  calls += 1
  if (calls === 3) {
    clearInterval(id)
    console.log('Łącznie wywołań:', calls)
  }
}, 150)
Konsola
Łącznie wywołań: 3
Debounce na setTimeout()
JavaScript
function debounce(fn, ms) {
  let timer
  return (...args) => {
    clearTimeout(timer)
    timer = setTimeout(() => fn(...args), ms)
  }
}

const saveDraft = debounce((text) => console.log('Zapisano szkic:', text), 200)

saveDraft('H')
saveDraft('He')
saveDraft('Hello')
Konsola
Zapisano szkic: Hello

Każde wywołanie saveDraft() czyści poprzedni timer przez clearTimeout(). Zapisany zostaje tylko ostatni szkic, 200 ms po ostatnim wywołaniu.

Dobre praktyki

#
  • Zawsze zapisuj identyfikator zwrócony przez setInterval() i wywołuj clearInterval(), gdy powtarzanie nie jest już potrzebne.
  • Gdy pojedyncze wywołanie może trwać dłużej niż odstęp, na przykład zapytanie do serwera, użyj łańcucha setTimeout() zamiast setInterval().
  • Do debounce (reakcja po przerwie w pisaniu) buduj na setTimeout(), nie na setInterval().

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.