• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zatrzymanie funkcji setInterval

VPS Starter Arubacloud
0 głosów
2,975 wizyt
pytanie zadane 20 lutego 2018 w JavaScript przez sosick Nowicjusz (160 p.)

Poznaję funkcje seInterval i setTimeout i mam mały problem z bardzo prostym zadaniem. Oto jego treść:

Napisz funkcję ```boilEgg```, która jako argument przyjmie czas w sekundach, a jej wywołanie spowoduje, że po zadanym czasie na konsoli wyświetli się komunikat "jajko ugotowane".
Dodatkowo co 5 sekund, podczas gotowania w konsoli wyświetl napis "jajko się gotuje".
Przetestuj swoją funkcję dla 30 sekund (czas gotowania).

Mój kod póki co wygląda tak: 

function boilEgg(seconds) {
    setInterval(function() {
        seconds -= 5;
        if (seconds === 0) {
            console.log('jajko ugotowane');
        } else {
            console.log('jajko się gotuje');
        }
    }, 5000);
}

boilEgg(30);

I o ile do pewnego momentu funkcja działa prawidłowo, to nie potrafię zrobić, aby po 'jajko ugotowane' przestała się wykonywać. Próbowałem użycia clearInterval, jednak w żadnym miejscu w którym go użyłem nie działał, na przykład:

function boilEgg(seconds) {
    setInterval(function boil() {
        seconds -= 5;
        if (seconds === 0) {
            console.log('jajko ugotowane');
            clearInterval(boil);
        } else {
            console.log('jajko się gotuje');
        }
    }, 5000);
}

boilEgg(30);

Będę wdzięczny za olśnienie mnie, bo jest to z pewnością banalny problem przy którym utknąłem dłuższą chwilę.

komentarz 20 lutego 2018 przez Maniek Bywalec (2,170 p.)

Nie znam się na js, ale po chwili czytania w internecie wnioskuje że clearInterval() działa na nazwe inreval czyli 

var myVar = setInterval(function(){ setColor() }, 300);

function setColor() {
    var x = document.body;
    x.style.backgroundColor = x.style.backgroundColor == "yellow" ? "pink" : "yellow";
}

function stopColor() {
    clearInterval(myVar);
}

 

1 odpowiedź

+2 głosów
odpowiedź 20 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Metoda setInterval (podobnie jak jej "odpowiednik" setTimeout) zwraca identyfikator, który musisz przekazać do clearInterval, aby ją zatrzymać.

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval

Zatem najpierw potrzebujesz zapisać sobie ten identyfikator:

var intervalId = setInterval(function boil() {

, a następnie przekazać go do clearInterval:

clearInterval( intervalId );

 

P.S. Nie ma w Twoim kodzie potrzeby nazywania funkcji jako boil (zostaw ją anonimową), ponieważ nie wywołujesz jej nigdzie - a do zatrzymania interwału nie jest Ci to potrzebne.

komentarz 20 lutego 2018 przez sosick Nowicjusz (160 p.)
edycja 20 lutego 2018 przez sosick

Edit:

Udało się. Poniższa funkcja działa tak jak określa to zadanie:

function boilEgg(seconds) {
    var boil = setInterval(function () {
        seconds -= 5;
        if (seconds === 0) {
            console.log('jajko ugotowane');
            clearInterval(boil);
        } else {
            console.log('jajko się gotuje');
        }
    }, 5000);
}

boilEgg(30);

Dziękuję za pomoc!

komentarz 20 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

var boil

Dla lepszej czytelności nadałbym nazwę np. boilIntervalId, żeby jednak sugerowała wskazywanie na identyfikator interwału.

Podobne pytania

0 głosów
1 odpowiedź 301 wizyt
pytanie zadane 19 października 2016 w JavaScript przez Muhin Gaduła (4,120 p.)
0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 26 lipca 2017 w JavaScript przez czujek22 Dyskutant (7,670 p.)
0 głosów
1 odpowiedź 392 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...