Почему мой код в setTimeout не работает в JavaScript?
Мой метод, Chomp.prototype.animate
Не работает должным образом. Мой код работает, когда функция не применяется Chomp.prototype.playerMove
,
когда Chomp.prototype.playerMove
применяется заявление if, включающее counter
до того, как addEventListener может иногда выполнить addEventListener, даже если counter
больше единицы, тогда он выполняет функцию в addEventListener много раз, в зависимости от того, как долго выполнялся код до его выполнения. В те времена он не должен был выполнять addEventListener, и если он это сделал, то счетчик должен быть добавлен к более чем одному, а затем не выполняться снова. Счетчик был добавлен более чем к одному, даже в эти моменты выполнения addEventListener несколько раз.
Даже незнакомец, когда у меня есть Chomp.prototype.animate
всегда установлен counter
1 вместо 0, он все равно выполнит оператор if, который говорит if (counter < 1)
один раз. Кроме того, когда Chomp.prototype.playerMove
применяется, то Chomp.prototype.chomping
не работает совсем правильно. (Это работает без Chomp.prototype.playerMove
). Это очень странно, и я не понимаю проблемы.
Если есть запрос на определенную часть моего кода, то я мог бы опубликовать это, но мой полный код, вероятно, не все полезно для вопроса.
var counter = 0;
var rotation;
var Chomp = function(x, y) {
/*many properties*/
}
Chomp.prototype.chomping = function() {
/*properties and conditions, etc.*/
}
Chomp.prototype.animate = function() {
var that = this;
Chomp.prototype.chomping.apply(this);
Chomp.prototype.playerMove.apply(this);
//counter = 1;
counter = 0;
setTimeout(function(){
Chomp.prototype.animate.apply(that);
}, 100);
}
Chomp.prototype.playerMove = function() {
var that = this;
/*values*/
var yNew = 0, xNew = 0, rotate = "";
var once = function(event) {
/*conditions for keys, etc.*/
Chomp.prototype.move.call(that, xNew, yNew, rotate);
/*values*/
removeEventListener("keydown", once);
}
if (counter < 1)
addEventListener("keydown", once);
/*more code*/
}
Chomp.prototype.move = function(xNew, yNew, rotate) {
var that = this;
counter += 1;
/*loops, conditions, etc.*/
var yellow = new Chomp(30, 60);
Chomp.prototype.animate.apply(yellow);
Спасибо заранее!:)
1 ответ
Вы применяете yellow
контекст при вызове Chomp.prototype.animate
, yellow
, который является примером Chomp
, будет связан с this
когда вы находитесь внутри Chomp.prototype.animate
декларация, что означает, что все ваши привязки к this
теперь привязаны к экземпляру Chomp yellow
и не Chomp.prototype
объект. Я не совсем уверен, почему вы используете Chomp.prototype
вызывать все ваши методы в методах-прототипах, если вы планируете использовать их с экземплярами Chomp
и не Chomp.prototype
(это два разных объекта!). Это может иметь больше смысла в использовании this
во всех ваших Chomp.prototype
методы.
Было бы необходимо увидеть остальную часть кода, потому что ваш прототип создает массу побочных эффектов в других методах, для которых вы только что показали /* etc... */
, и я не уверен, какую логику эти побочные эффекты вызывают в вашей программе... Опубликуйте больше кода или пишите мне, и мы вместе сможем поработать над рефакторингом, чтобы избежать этих проблем. ура
PS хотел опубликовать это как комментарий, но это слишком долго