setTimeout работает с разной скоростью

Всем привет, хочу разобраться в вопросе, ответ на который не могу найти.
Решил для практики написать небольшую игру, где игрок должен находить одинаковые пары карт, кликая по ним.
Ссылка на репозиторий
Ссылка на игру
Фрагмент кода, который у меня вызывает вопрос:

const openCard = (card) => {
    if (chooses.length < 2) {
        chooses.push(card);
        let front = card.querySelector('*');
        card.classList.remove('closed');
        front.classList.remove('closed');
        card.classList.add('opened');
        front.classList.add('opened');
    }

    setTimeout(() => {
        if (chooses.length === 2) {
            if (!isMatched(chooses[0], chooses[1])) {
                closeChosenCards();
                chooses = [];
            }
            else {
                matchCount++;
                if (isEnd()) {
                    endGame();
                }
            }
            chooses = [];
        }
    }, 1500)
}

При перевороте игроком очередной карты проверяется подняты ли на текущий момент 2 карты, и если да - идет проверка на сопоставление пары. Если карты не одинаковые, то карты переворачиваются обратно, и здесь стоит setTimeout(..., 1500), чтобы это не происходило моментально и игрок увидел, что карты не одинаковые.
Бывает, что карты переворачиваются с нормальной задержкой, но бывает и так, что они переворачиваются после долгой задержки или вообще чуть ли не моментально. Почему так происходит и как решить эту проблему?


Ответы (1 шт):

Автор решения: danil0110

Проблема заключалась в том, что проверка на количество открытых карт находилась непосредственно внутри setTimeout, когда логичнее запускать setTimeout после проверки.

if (chooses.length === 2) {
    setTimeout(() => {
        if (!isMatched(chooses[0], chooses[1])) {
            closeChosenCards();
            chooses = [];
        }
        else {
            matchCount++;
            if (isEnd()) {
                endGame();
            }
        }
        chooses = [];
    }, 1500);
}
→ Ссылка