2012-03-15 12 views
1
setInterval(this.Animate(), this.speed); 

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

+0

Как мы определяем 'u' –

+0

Указатель на тот же класс ... –

ответ

6

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

setInterval(this.Animate.bind(this), this.speed); 
+1

+1 Хорошая возможность того, что текущий' this' должен быть сохранен как вызывающий контекст. –

5

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

setInterval(this.Animate, this.speed); 

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

3

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

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

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

То, что вы хотите сделать, это создать замыкание

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

that сохраняет текущую область.

5

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

setInterval(this.Animate, this.speed); 

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

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

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

1

Если вы ищете JQuery обновить сценарий, попробуйте:

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

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