Javascript setInterval запускается только один раз - PullRequest
1 голос
/ 15 марта 2012
setInterval(this.Animate(), this.speed);

Ожидается, что он будет выполняться каждый раз при этой скорости.Да, но браузеры запускают его только один раз.Каковы возможные причины этого?

Ответы [ 5 ]

7 голосов
/ 15 марта 2012

Если Animate является производной функцией от прототипа, вам придется использовать:

setInterval(this.Animate.bind(this), this.speed);
6 голосов
/ 15 марта 2012

Попробуйте запустить вашу функцию без скобок, когда вы ставите скобки, она всегда вызывает функцию, а не передает ее, что вам и нужно:

setInterval(this.Animate, this.speed);

Если она все еще не работает,Вы должны отладить и выяснить, какова область действия «это», так как «это» может измениться.Вы можете сделать это, добавив точку останова в отладчик JS вашего браузера.Кроме того, вы можете попробовать это, чтобы избежать проблемы с областью действия: 'apply'

var animate = this.animate.apply(this)
setInterval(animate, this.speed);

ps: может быть хорошим вариантом избежать setInterval для анимации, поскольку они могут стоять в очереди, а затем запускаться сразу.Вместо этого вызовите setTimedout раз и снова в конце функции (this.Animate), чтобы создать цикл.

5 голосов
/ 15 марта 2012

Выполните следующие действия:

setInterval(this.Animate, this.speed);

Вы выполняете функцию вместо назначения ссылки на функцию, которая будет выполняться через определенный интервал ...

3 голосов
/ 15 марта 2012

Давайте посмотрим на ваш код

setInterval(this.Animate(), this.speed);

То, что он говорит, это сразу же запустите функцию this.Animate() и сохраните все, что когда-либо вернется, для вызова.

Что вы хотитедля этого нужно создать замыкание

var that = this;
setInterval( function(){ that.Animate() }, this.speed);

. that поддерживает текущую область действия.

1 голос
/ 15 марта 2012

Если вы ищете скрипт обновления JQuery, попробуйте:

refreshId = setInterval(function() {
    // Events or Actions
}, 5000);

Если вы когда-нибудь захотите приостановить или остановить это, используйте интервал очистки: clearInterval(refreshId);.

...