Tämä alla oleva toiminto ei toimi kuten haluan sen toimivan; koska olen JS-noviisi, en ymmärrä miksi.
Sen on odotettava 5 sekuntia ennen kuin se tarkistaa, onko newState
-tila -1
.
Tällä hetkellä se ei odota, vaan tarkistaa heti.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
Sinun on laitettava koodisi siihen takaisinkutsufunktioon, jonka annat setTimeout
:lle:
function stateChange(newState) {
setTimeout(function () {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}, 5000);
}
Kaikki muu koodi suoritetaan välittömästi.
Sinun ei pitäisi vain yrittää pysäyttää 5 sekuntia javascriptillä. Se ei toimi sillä tavalla. Voit ajoittaa koodifunktion suoritettavaksi 5 sekunnin kuluttua tästä hetkestä, mutta sinun on laitettava koodi, jonka haluat suorittaa myöhemmin, funktioon, ja loput koodistasi kyseisen funktion jälkeen jatkavat suorittamista välittömästi.
Esim:
function stateChange(newState) {
setTimeout(function(){
if(newState == -1){alert('VIDEO HAS STOPPED');}
}, 5000);
}
Mutta jos sinulla on tällainen koodi:
stateChange(-1);
console.log("Hello");
Lauseke console.log()
suoritetaan välittömästi. Se ei odota, kunnes aikakatkaisu palaa stateChange()
-funktiossa. Javascriptin suoritusta ei voi vain keskeyttää ennalta määrätyksi ajaksi.
Sen sijaan kaiken koodin, jonka haluat suorittaa viiveellä, on oltava setTimeout()
-kutsufunktion sisällä (tai sitä on kutsuttava kyseisestä funktiosta).
Jos yrität "keskeyttää" silmukoimalla, Javascript-tulkki "roikkuu" jonkin aikaa. Koska Javascript suorittaa koodisi vain yhdessä säikeessä, silmukan aikana mikään muu ei voi toimia (muita tapahtumankäsittelijöitä ei voida kutsua). Silmukointi odottamalla jonkin muuttujan muuttumista ei siis koskaan toimi, koska mikään muu koodi ei voi suorittaa muuttujan muuttamista.
Käytä tällaista viivefunktiota:
var delay = ( function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
Käyttö:
delay(function(){
// do stuff
}, 5000 ); // end delay
Krediitit menevät käyttäjälle CMS, katso https://stackoverflow.com/q/1909441/1066234.