Как выяснить, почему функция setTimeout не работает в моем коде? - PullRequest
0 голосов
/ 26 апреля 2019

Мой код работает, и все значения верны, поэтому он должен работать, но это не так.

Я попытался локализовать переменные, изменить время и переставить функции и теги имен.

auto1();  
var autocount = 0;
var autotrue = 0;

function auto1(){
    setTimeout(function() {
      while(autotrue==1){
        money = money + autocount;
        setText("money_display",money);
      }
    }, 1000);

    onEvent("auto1", "click", function(){
      if(money >= 10){autotrue = 1;
        money = money - 10;
        autocount = autocount+1;
        console.log("You now have " + autocount + " J$ per second");
      } else {
        console.log("you have insufficient J$ for this purchase");
      }
    });
}

Я ожидаю, что это добавит 1 к моей денежной переменной каждые 1000 мс.Но это никак не влияет на денежную переменную

Ответы [ 4 ]

2 голосов
/ 26 апреля 2019

Здесь есть несколько проблем:

setTimeout запускается только один раз, по истечении 1000 мс. В этом случае, когда он запускается, вы собираетесь войти в бесконечный цикл, потому что autotrue никогда не становится истинным. Это все еще 0, и вы добавляете его к деньгам, и деньги никогда не получат больше 10, потому что 0 + 0 = 0.

Если вы хотите многократно прибавлять к деньгам каждые 1000 мс, вы должны использовать setInterval, без какой-либо петли внутри. Это будет вызывать вашу функцию снова и снова каждые 1000 мс.

0 голосов
/ 26 апреля 2019

Было несколько проблем с вашим кодом:

  1. переменная money не определена
  2. Цикл while внутри таймера приведет к зависанию браузера
  3. timeout должно быть interval вместо
  4. autotrue должно быть логическим

Я подделал функцию setText() и изменил onEvent() на addEventListener() ради рабочего примера:

auto1();

var autocount = 0;
var autotrue = false;
var money = 10;

function auto1() {
  autoAddInterval = setInterval(function() {
    if (autotrue) {
      money = money + autocount;
      setText("money_display", money);
    }
  }, 1000);
  document.getElementById('auto1').addEventListener("click", function() {
    if (money >= 10) {
      autotrue = true;
      money = money - 10;
      autocount = autocount + 1;
      console.log("You now have " + autocount + " J$ per second");
    } else {
      console.log("you have insufficient J$ for this purchase");
    }
  });
}

function setText(id, value) {
  document.getElementById(id).innerText = value + ' J$';
}

setText("money_display", money);
balance: <span id="money_display">0 J$</span><br>
<button id="auto1">purchase +1 J$ per second</button>
0 голосов
/ 26 апреля 2019

Уберите это, и вы увидите, что таймер работает.

  while(autotrue==1){
    money = money + autocount;
    setText("money_display",money);

Ваша проблема в том, что вы не устанавливаете autotrue var равным 1.

0 голосов
/ 26 апреля 2019

Вы вызываете auto1 до того, как переменные autocount и autotrue были инициализированы равными 0, поэтому они по-прежнему undefined и нарушат ваши вычисления.Вы должны вызывать эту функцию после инициализации всех переменных.

Кроме того, while(autotrue==1){ выглядит так, как будто оно бесконечно, поскольку ничего не меняется autotrue.Бесконечные циклы всегда плохи.

...