Weboldal keresés

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.