2013-04-17 5 views
0

Ehllo! Когда условия выполняются, моя функция не возвращается (уходит).Моя функция не возвращается

var arrowReady = false; 
var arrowImage = new Image(); 
var deg = 0; 
arrowImage.onload = function() { 
    arrowReady = true; 
    function moveArrow() { 
     setInterval(function() { 
      ctx1.save(); 
      deg++; 
      ctx1.rotate(deg * Math.PI/180); 
      // Here is^the amount of degrees it turns. 
      ctx1.clearRect(300, 200, 52, 310); 
      ctx1.drawImage(arrowImage, 300, 100, 42, 300); 
      ctx1.restore(); 
     }, 100); 

     if (deg == 40) return; 

    } 
} 

С моей точки зрения, когда deg = 40, функция должна останавливаться. Но это не так. Какие-либо предложения?

+0

Вы хотите остановить функцию в setInterval, когда 'deg == 40'? – Musa

+0

Да, это план. Я понял, что ответ Алекс Макпа сработал. – Bryce

ответ

2

Tricky JavaScript здесь происходит. moveArrow вызывается только один раз при загрузке документа. возврат или нет не остановит ваш интервал.

Вам необходимо сохранить ссылку на интервал:

var interval = setInterval(... 

, а затем из анонимного setInterval функции, когда deg ==40 вы хотите clearInterval(interval), чтобы остановить его от работы.

Попробуйте это:

var arrowReady = false; 
var arrowImage = new Image(); 
var deg = 0; 
arrowImage.onload = function() { 
    arrowReady = true; 
    function moveArrow() { 
     var interval = setInterval(function() { 
      if (deg == 40) { 
       clearInterval(interval); 
       return; 
      } 
      ctx1.save(); 
      deg++; 
      ctx1.rotate(deg * Math.PI/180); 
      // Here is^the amount of degrees it turns. 
      ctx1.clearRect(300, 200, 52, 310); 
      ctx1.drawImage(arrowImage, 300, 100, 42, 300); 
      ctx1.restore(); 
     }, 100); 

    } 
} 
+1

Будет ли магия закрытия работать в этом случае? Это потребовало бы, чтобы 'interval' был зафиксирован как ссылка, потому что я считаю, что он не инициализирован до возвращения' setInterval'. – TNW

0

Я не программист JavaScript, но вы не должны указывать значение для возврата

ПРИМЕР if (deg == 40) return deg;

+0

Нет, здесь не нужно. – Bryce

0

Пока не ясно, что это последний условный даже должен делать. После этого ничего не происходит, поэтому функция все равно прекратит выполнение. Почему это имеет значение, если deg == 40, если это когда вызов функции заканчивается, несмотря ни на что?

Больше, я уверен, это факт, что данная функция фактически не является изменить значение deg. Таким образом, deg никогда не будет равняться 40 на этой линии. То, что вы делаете, представляет очередную функцию для запуска в более позднее время (100 мс?). После того, как эта функция поставлена ​​в очередь, элемент управления сразу же переходит к оператору if (до этого запускается другая функция).

Таким образом, deg изменяется в совершенно другой функциональной области после выполнения инструкции if.