Czy settimeout blokuje wykonywanie kodu?


(bogacz225) #1

Witam, 

mam ustawionego timeouta na dodawanie literek do hasła. 

let setChar = (index, letter) => {

        let oneLetter = passContainer.querySelectorAll('li');

        setTimeout(function () {

            oneLetter[index].innerHTML = letter;

        }, 500);

        oneLetter[index].classList.add('animation');

    };

Po odgadnięciu hasła ten kod się nie wykonuje, a dokładniej mówiąc IF porównujący hasła (arrayPass.join(’ ') === password)

let changeStatus = (index, bool) => {

        let arrayPass = [];

        if (bool) {

            letters[index].classList.add('exist');

            let actualPassword = passContainer.querySelectorAll('li');

            for (let i = 0; i < actualPassword.length; i++) {

                arrayPass.push(actualPassword[i].innerText);

            }

            if (arrayPass.join('') === password) {

                let img = popup2.querySelector('img');

                popup2.style.display = 'block';

                img.src = zdj;

            }

        }

        if (!bool) {

            letters[index].classList.add('notExist');

            updateChances();

        }

    };

 

Zaznaczam, że po usunięciu Timeouta wszystko działa. Jak go użyć, aby tak się nie stało? Próbowałem przypisywać go do zmiennej i potem czyścić, ale także nie działa. Być może robiłem to w złym miejscu?


(kowgli) #2

Problemem może być wartość index i letter, w momencie wykonania się kodu wewnątrz setTimeout.

 

Poczytaj sobie tu: http://www.teknically-speaking.com/2013/01/closures-in-loops-javascript-gotchas.html

Generalnie powinieneś przekazać te wartości jako parametry do funkcji. W przeciwnym wypadku odwołujesz się nie do tego co Ci się wydaje. 

Coś w stylu

setTimeout(function (index, letter) { oneLetter[index].innerHTML = letter; }, 500);

Tak mi się przynajmniej wydaje. Nie testowałem.


(bogacz225) #3

Najgorsze, że nie mogę tego debugować w przeglądarce bo jakieś inne skrypty wchodzą… ;/ Zaraz będę testować. 


(kowgli) #4

Nie do końca rozumiem co to znaczy, że wchodzą inne skrypty. Wstawiałeś polecenie “debugger;”?