Javascript klikačka
Při programování počítadla kliků nás torchu trápila vlákna. Respektive mě trápila vlákna. Počítadlo kliků samo o sobě nepotřebuje pracovat s časem. Ale odpočítavadlo, které jsme chtěli mít součástí apky, aby nám odměřilo čas (7sekund) po které můžeme mordovat myš :P, už s časem pracovat musí. A mě napadlo jediné řešení pomocí vláken. No a pak jsem vlákna viděla všude i tam kde nejsou. Takže problém byl v těchto dvou příkazech:
setInterval("odpocet()", 1000); //spust vlakno v kterem budes kazdou vterinu volat funkci odpocet() setTimeout('odpocet()', 1000); //spust funkci odpocet za vterinu
Kdo je líny číst více než tři první písmena příkazu, jako já, těžko vidí rozdíl mezi těmito příkazy. Ale rozdíl je dost zásadní. Prvním příkaz použijeme v případě, že řešíme odpočítavadlo vlákny. Druhý příkaz použijeme, řešíme li odpočítávání pomocí rekurze (rekurze=funkce volá sama sebe).
Odpočítavadlo řešeno pomocí rekurze
var zbyvajiciCas = 3; setTimeout('odpocet()', 1000); //po uplynuti 1s spust funkci odpocet function odpocet(){ //funkce odpocet zbyvajiciCas=zbyvajiciCas-1; //odecti cas document.getElementById("cas").innerHTML=zbyvajiciCas; //vypis cas if(zbyvajiciCas>0){ setTimeout('odpocet()', 1000); //po uplynuti 1s zavolej samu sebe REKURZE } console.log("bezi odpocet cas="+zbyvajiciCas); }
Odpočítavadlo řešeno pomocí vlákna
var zbyvajiciCas = 3;
var vlasek = setInterval('odpocet()', 1000); //spusteni vlanka, ktere kazdych 1000ms zavola metodu odpocet
function odpocet(){ //funkce odpocet
if(zbyvajiciCas>0){ //pokud nevyprsel cas
zbyvajiciCas=zbyvajiciCas-1; //odecti cas
document.getElementById("cas").innerHTML=zbyvajiciCas; //vypis cas
}else{ //jinak (pokud vyprsel ca)
clearInterval(vlasek); //zlikviduj vlakno jmenem vlasek
}
console.log("cas"+zbyvajiciCas);
}