Odczekaj 5 sekund przed wykonaniem następnej linii

Ta funkcja poniżej nie działa tak, jakbym tego chciał; będąc nowicjuszem w JS nie mogę się dowiedzieć dlaczego.

Potrzebuję, aby odczekała 5 sekund przed sprawdzeniem czy newState jest -1.

Obecnie nie czeka, tylko od razu sprawdza.

function stateChange(newState) {
  setTimeout('', 5000);

  if(newState == -1) {
    alert('VIDEO HAS STOPPED');
  }
}

Musisz umieścić swój kod w funkcji callback, którą dostarczasz do setTimeout:

function stateChange(newState) {
    setTimeout(function () {
        if (newState == -1) {
            alert('VIDEO HAS STOPPED');
        }
    }, 5000);
}

Każdy inny kod wykona się natychmiast.

Komentarze (3)

Nie powinieneś po prostu próbować pauzować 5 sekund w javascript. To nie działa w ten sposób. Możesz zaplanować funkcję kodu do uruchomienia za 5 sekund od teraz, ale musisz umieścić kod, który chcesz uruchomić później w funkcji, a reszta twojego kodu po tej funkcji będzie nadal działać natychmiast.

Na przykład:

function stateChange(newState) {
    setTimeout(function(){
        if(newState == -1){alert('VIDEO HAS STOPPED');}
    }, 5000);
}

Ale, jeśli masz kod taki jak ten:

stateChange(-1);
console.log("Hello");

Polecenie console.log() zostanie uruchomione natychmiast. Nie będzie czekać, aż upłynie limit czasu w funkcji stateChange(). Nie można po prostu wstrzymać wykonywania javascript na określony czas.

Zamiast tego, każdy kod, który chcesz uruchomić z opóźnieniem musi być wewnątrz funkcji wywołania zwrotnego setTimeout() (lub wywołany z tej funkcji).

Jeśli spróbowałbyś "wstrzymać" przez zapętlenie, wtedy zasadniczo "zawiesiłbyś" interpreter Javascript na pewien okres czasu. Ponieważ Javascript uruchamia Twój kod tylko w jednym wątku, kiedy Ty'jesteś zapętlony nic innego nie może działać (żadne inne event handlery nie mogą zostać wywołane). Tak więc, pętla czekająca na zmianę jakiejś zmiennej nigdy nie zadziała, ponieważ żaden inny kod nie może zostać uruchomiony, aby zmienić tę zmienną.

Komentarze (3)

Użyj funkcji opóźniającej, takiej jak ta:

var delay = ( function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

Użycie:

delay(function(){
    // do stuff
}, 5000 ); // end delay

Credits go to user CMS, zobacz https://stackoverflow.com/q/1909441/1066234

Komentarze (0)