javascript - szám kiírása 1-től 10-ig minden 2 másodpercben
Azt akarom, hogy számot nyomtassak minden n másodperc után, és néhány feltétel alapján változtatom az időzítőt, valamint leállítom a nyomtatási függvényt. Így csináltam --
var myfunc = {
value : 1,
running : false,
timer : 1000,
start : function(){
this.running = true;
clearInterval(this.timeout);
this.timeout = setTimeout(function() {
myfunc.execute(myfunc);
}, myfunc.timer);
},
execute : function(){
if(!this.running) return false;
console.log( 'Currently at -- ' + (this.value++) );
if (this.value > 5 ){
this.changetiming();
}
if (this.value > 10 ){
this.stop();
return;
}else{
this.start();
}
},
changetiming : function(){
this.timer = 3000;
},
stop : function(){
this.running = false;
clearTimeout(this.timeout);
}
};
myfunc.start();
Most tudni akarom, mi a baj a következő kóddal --
for(var i = 0; i <= 10; i++){
print(i);
}
function print(i){
setTimeout(function(){
console.log(i)
},2000);
}
Válasz #1
itt van a helyes és egyszerű módja ennek ES6+-ban:
const printNumbersForEvery2Sec = (n)=>{
for (let i = 1; i <= n; i++) {
setTimeout( () =>{
console.log(i)
}, i * 2000)
}
}
printNumbersForEvery2Sec(10);A i szorzásával minden setTimeout() 2-től 20 másodpercig (2000 x 1, 2000 x 2…) késleltetve lesz.
Válasz #2
Eléggé biztos vagyok benne, hogy a kérdés „Miért működik ez a JavaScript kód
for (var i = 0; i <= 10; i++){
print(i);
}
function print(i) {
setTimeout(function(){
console.log(i)
},2000);
}
Azt a kérdést már feltették, hogy „egyszerre nyomtassa ki az 1-től 10-ig terjedő értékeket, miután 2 másodperc eltelt”.
Ez egy gyakori hiba.
Amit csinálsz, az az, hogy 10-szer hívod meg a print-et. Minden print hívás csak néhány mikro-szekundumot vesz igénybe. Miért? Mert ez csak meghívja a setTimeout-ot. A setTimeout végrehajtása csak néhány mikro-szekundumot igényel. A hívás egyedül annyit csinál, hogy ütemez valamit, ami a jövőben fog megtörténni. Tehát néhány mikro-szekundum alatt 10 dolgot ütemeztél, ami körülbelül 2 másodperc múlva fog végbemenni. Minden ütemezés körülbelül egyszerre történik. Így az összes konzolnaplózás nagyjából egyszerre történik, két másodperccel azután, hogy ütemezted őket.
Lásd Satapal hozzászólását a kérdésedhez, hogy megtudd, hogyan lehet szépen megcsinálni, amit szeretnél.
