сработавшая функция внезапно становится "не функцией", в то время как setInterval () выполняет другую функцию - PullRequest
0 голосов
/ 18 января 2019

tl; dr: моя функция не запускается, пока setInterval () запускает другую функцию каждые 3 секунды.

Я делаю текстовую игру по садоводству, которая запускает "plant ()", когда я набираю plant. У меня также есть setInterval (updatePlots, 3000) собирается.

обе эти функции работают нормально самостоятельно, но когда я пытаюсь запустить функцию plant () во время выполнения setInterval (), возникает ошибка Uncaught TypeError: plant is not a function

(я знаю, что это setInterval (), потому что я тестировал посадку без ее запуска, и она работала нормально.)

что я пытался (не работал):

if (command == "plant") {
  clearInterval(timer);
  plant(a, b);
  var timer = setInterval(updatePlots, 3000);
}

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

function updatePlots() {
  fullplots = [];
  for (i = 0; i < plots.length; i++) {
    if (plots[i].length) {
      fullplots.push(i);
    }
  }

  for (i = 0; i < fullplots.length; i++) {
    plant = plots[fullplots[i]][0];
    status = plots[fullplots[i]][1];
    growth = plots[fullplots[i]][2];

    if (growth < 100) {
        plots[fullplots[i]][2]++;
    }
  }

  if (document.getElementById('plots').style.display == 'block') {
    getPlots();
  }
}

...

function processTwo(command, a) {
  if (command == 'plant') {
    clearInterval(timer);
    console.log('about to plant 1'+a);
    plant(1, a);
    var timer = setInterval(updatePlots, 3000);
  }
  else { createError() }
}

обновление: решено!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Проблема возникает в методе updatePlots, вызываемом setInterval. То, что вы делаете там, это присвоение нового значения «plant»

plant = plots[fullplots[i]][0];

Затем, когда вызывается функция plant, она указывает на новое значение, назначенное ему в updatePlots, вместо функции, которая была у вас изначально. Вы должны объявить новую переменную в updatePlots, чтобы избежать изменения метода установки. Я бы использовал другое имя, чтобы избежать путаницы.

0 голосов
/ 18 января 2019
function updatePlots() {
  // this way, the global plant function is not overwritten
  // @see JavaScript variable scope
  var plant;
  // You might want to 'var' your other local (?) variables, too
  // var fullplots, i, status, growth;
  fullplots = [];
  for (i = 0; i < plots.length; i++) { //get fullplots
    if (plots[i].length) {
      fullplots.push(i);
    }
  }

  for (i = 0; i < fullplots.length; i++) {
    // at this line of code you overwrite the global plant, which is not a function anymore then
    plant = plots[fullplots[i]][0];
    status = plots[fullplots[i]][1];
    growth = plots[fullplots[i]][2];

    if (growth < 100) { //increment
        plots[fullplots[i]][2]++;
    }
  }

  if (document.getElementById('plots').style.display == 'block') {
    getPlots();
  }
}
...