Попытка получить setTimeout (); работать в цикле.

0

Это мой код, я пытаюсь его получить, когда нажата кнопка, вы можете рубить дерево, когда вы не рубите дерево, он использует таймер, чтобы попытаться сделать это снова ( через 1 секунду). Как только дерево будет расколото, предположим, чтобы установить 5-секундный таймер, который делает его "неактивным", пока таймер не встанет, он снова будет "активным". Для этого вам нужно снова нажать кнопку, чтобы начать цикл.

    var woodcuttingLevel = 0;
    var count = 0;
    var treeSpawn;
    var reClick;

    function cutTree(){
        var randomEvent = Math.floor((Math.random()*7)+1);

        document.getElementById("message").innerHTML = "chop " + count;
        count += 1;

        switch(randomEvent){
            case 1:
             //add a log
             document.getElementById("treeActive").innerHTML = "inActive1";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            break;
            case 2:
            //add a log if over level 5
            if(woodcuttingLevel >= 5){
             document.getElementById("treeActive").innerHTML = "inActive2";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            }
             reClick=setTimeout(function(){reClick()},1000);
            break;
            case 3:
            //add a log if over level 8
            if(woodcuttingLevel >= 8){
             document.getElementById("treeActive").innerHTML = "inActive3";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            }
             reClick=setTimeout(function(){reClick()},1000);
            break;
            case 4:
            //add a log if over level 13
            if(woodcuttingLevel >= 13){
             document.getElementById("treeActive").innerHTML = "inActive4";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            }
             reClick=setTimeout(function(){reClick()},1000);
            break;
            case 5:
            //add a log if over level 17
            if(woodcuttingLevel >= 17){
             document.getElementById("treeActive").innerHTML = "inActive5";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            }
             reClick=setTimeout(function(){reClick()},1000);
            break;
            case 6:
            //add a log if over level 22
            if(woodcuttingLevel >= 22){
             document.getElementById("treeActive").innerHTML = "inActive6";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            }
             reClick=setTimeout(function(){reClick()},1000);
            break;
            case 7:
            //add a log if over level 30
            if(woodcuttingLevel >= 30){
             document.getElementById("treeActive").innerHTML = "inActive7";
             treeSpawn=setTimeout(function(){spawnTree()},5000);
            }
             reClick=setTimeout(function(){reClick()},1000);
            break;
            default:
            //error
        }

    }

    function spawnTree(){
        document.getElementById("treeActive").innerHTML = "Active";
        clearInterval(treeSpawn);
        clearInterval(reClick);
    }

    function reClick(){
        cutTree();
    }

Функция reClick() не работает, я не совсем уверен, почему. Может ли кто-нибудь привести меня к ответу? Спасибо за ваше время!

  • 1
    Совет: function(){ fn() } === fn
  • 0
    Не уверен, что я следую, я уходил из этого myVar = setTimeout (function () {alert ("Hello")}, 3000) ;. Что такое (=== fn) часть?
Показать ещё 3 комментария
Теги:

2 ответа

2
Лучший ответ

Функция reClick не работает, потому что ее больше нет, когда вы пытаетесь ее вызвать.

Вы использовали одно и то же имя для переменной, которая содержит идентификатор таймаута, поэтому он заменит эту функцию при запуске таймаута. Используйте другое имя для переменной. Изменить:

var reClick;

чтобы:

var reClickTimer;

и все:

reClick=setTimeout(function(){reClick()},1000);

чтобы:

reClickTimer=setTimeout(function(){reClick()},1000);

а также:

clearInterval(reClick);

чтобы:

clearInterval(reClickTimer);

Замечание: поскольку метод setTimeout принимает функцию обратного вызова в качестве первого параметра, вам не нужно выражение функции, вызывающее эту функцию, вы можете сами использовать ссылку на функцию:

reClickTimer=setTimeout(reClick,1000);
  • 0
    Это сработало, большое спасибо за вашу помощь. Очень грубая ошибка с моей стороны!
0

Проблема в том, что когда вы выполняете это задание

reClick=setTimeout(function(){reClick()},1000);

Вы по существу reClick определение функции reClick и заменяете его результатом setTimeout, который является "id", который идентифицирует текущую операцию таймаута. Вам нужно будет переименовать переменную, определенную сверху, с помощью var reClick, например, var reClickTimeout, которую вы можете использовать следующим образом

reClickTimeout=setTimeout(function(){reClick()},1000);

Разумеется, вам также необходимо будет заменить все другие неулокальные ссылки, например

clearInterval(reClick); -> clearInterval(reClickTimeout);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню