setInterval() / clearInterval()

setInterval() / clearInterval()
SC
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:7
0

Panowie szybkie pytanie, ponieważ mam mały problem.
Kod jest następujący:

Kopiuj
var myModule = (function() {


  var _fun = function() {
      console.log('dummy content');
  };

  var _init = function() {
    _fun();
  };

  return {
    init: _init,
  }

})();

setInterval(myModule.init, 1000);

Pytanie jak osiągnąć efekt, że wywołuję w interwale funkcję co 1s, potem chciałbym ten interwał czyścić i znowu wywołać tą funkcję i tak w kółko.
Z góry dziękuję za sugestie.

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
0

Czekaj, czekaj. Chcesz wywoływać funkcję co sekundę? To po jasną cholerę czyścić interwał?

SC
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:7
0

Każdy nowy interwał to nowy licznik, więc jeśli go nie wyczyścisz to co raz bardziej obciążasz przeglądarke

Maciej Cąderek
Maciej Cąderek
??
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
0

Nie bardzo rozumiem. Jaka jest różnica pomiędzy poniższymi:

Kopiuj
// a)
function foo () {}
setInterval(foo, 1000);

// b)
function foo () {
 // zrób coś tam
 clearInterval(id);
 id = setInterval(foo, 1000);
}
var id = setInterval(foo, 1000);
edytowany 2x, ostatnio: Desu
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 16 godzin
1

Na pierwszy rzut oka różnią się nadmiarowym kodem. Jednak jest jedna różnica, która jest bardzo istotna. Pierwsza wersja kodu spowoduje, że foo() będzie wołane co około sekundę (chyba, że silnik js będzie zajęty czym innym, to wtedy dłużej). Druga wersja będzie wywoływać się co około sekundę + czas wykonania foo() oraz ma jeden niebezpieczny błąd. Otóż jeśli kod foo() będzie wywoływać się dłużej, niż długość interwału, to zanim zostanie wywołane clearInterval nastąpi zakolejkowanie kolejnego wywołania foo, a to doprowadzi do niekontrolowanego rozmnożenia wywołań foo().
Dlatego 1) nigdy clearInterval() w środku obsługi tyknięcia interwału 2) jeśli potrzebujesz 1s od zakończenia obsługi tyknięcia, to użyj setTimeout().
Jest jeszcze jedna, tym razem drobna różnica - jeśli poleci wyjątek, to clearInterval/setInterval nie wykona się.

Jeśli z pewnych powodów chcesz za każdym razem ustawiać od nowa kolejne wywołanie, to użyj setTimeout.


DE
Tak, to wiem (rozmnożenia wywołań foo() + braku możliwości ich anulowania, bo informacja o id interwału może zostać w międzyczasie zastąpiona), bardziej mi chodziło o to, po jakiego grzyba autor chce coś takiego zrobić, żeby anulować interwał i kolejkować nowy. Wydaje mi się, że autorowi chodziło o to, żeby nie kolejkować kolejnego interwału, jeżeli funkcja się jeszcze nie wykonała, do czego idealny jest setTimeout, ale nie mam pewności, czy to tot :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.