2015-03-03 5 views
1

http://jsfiddle.net/689nauny/JavaScript - setInterval только работает один раз

setInterval() работает только один раз ... WTF происходит?

SO просит более подробную информацию, но предоставление JSFiddle о таком наглядном, как я могу быть? Я попытался использовать анонимную функцию и теперь обратный вызов. Я просто не понимаю? : -/

HTML

<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script> 

<div id="qanda-timer-container"> 
    <div class="qanda-timer"> 
     <span id="qanda-time-remaining"></span> 
    </div> 
</div> 

JS

function intervalFunc(thinkingTime, answerTime) 
    { 
     jQuery('#qanda-time-remaining').text(''+(thinkingTime - 1)); 
    } 

    function enableTimer(time) 
    { 
     var intervalID; 
     var hasThinkingTime = true; 
     var thinkingTime = time; 

     var hasAnswerTime = true; 
     var answerTime = 10; 

     if(hasThinkingTime && hasAnswerTime) 
     { 
      setInterval(intervalFunc(thinkingTime, answerTime), 1000); 
     } 

     setTimeout(function(){ 

      clearInterval(intervalID); 

     }, time * 1000); 
    } 

enableTimer(30); 
+1

Это потому, что вы вызываете 'clearInterval (intervalID);' , –

+0

Но это не должно происходить в течение 30 секунд с учетом примера .... – AdamJeffers

+0

Другая проблема: вы никогда не назначаете 'intervalID'. – Barmar

ответ

7

Вам нужно обернуть обработчик интервала в функции:

 intervalId = setInterval(function() { intervalFunc(thinkingTime, answerTime) }, 1000); 

Ваш код, как Размещенное вызова в и передать результат setInterval(). Интервальный таймер не работает вообще!

После этого вам необходимо устранить проблему сохранения значения времени убывания. В настоящее время вы передаете переменную как параметр и вычитаете ее, но вы не обновляете исходную переменную.

function intervalFunc(thinkingTime, answerTime) 
{ 
    jQuery('#qanda-time-remaining').text(''+(thinkingTime)); 
} 

Затем измените setInterval установки:

intervalId = setInterval(function() { intervalFunc(--thinkingTime, answerTime) }, 1000); 

} 
+0

nope: http://jsfiddle.net/689nauny/1/ – AdamJeffers

+2

@AdamJeffers - он работает несколько раз в этом обновлении, вы не уменьшаете число, поэтому каждый раз, когда запускается setInterval, вы получаете тот же выход – Jamiec

+0

Исходная переменная должна оставаться прежней ... Это общее количество времени. Каждую секунду я просто убираю 1 от этого ...? Или я чего-то не хватает? – AdamJeffers

0

Вот рабочий пример: http://jsfiddle.net/689nauny/3/

Вашего вопрос был частично с областью и, в общем, как вы декрементируетесь обратный отсчет переменной

var thinkingTime = undefined; 
var answerTime = undefined; 
var intervalID = undefined; 

function enableTimer(time) { 

    var hasThinkingTime = true; 
    thinkingTime = time; 

    var hasAnswerTime = true; 
    answerTime = 10; 

    if (hasThinkingTime && hasAnswerTime) { 
     intervalID = setInterval(function() { 
      thinkingTime -= 1; 
      jQuery('#qanda-time-remaining').text('' + (thinkingTime)); 
     }, 1000); 
    } 

    setTimeout(function() { 

     clearInterval(intervalID); 

    }, time * 1000); 
} 

enableTimer(30); 
+0

Можно также отметить, что setInterval не так надежен, как setTimeout и использует рекурсию. – eyegropram

1

Ваш код не работает из-за t его линия:

setInterval(intervalFunc(thinkingTime, answerTime), 1000); 

Изменить его в этом:

setInterval(function(){ 
    intervalFunc(thinkingTime, answerTime); 
}, 1000); 

Вы должны предоставить функцию setInterval(), в то время как вы обеспечиваете undefined.

Именно поэтому он не работает.

Running Код:

function enableTimer(time) 
 
{ 
 
    var elem = jQuery('#qanda-time-remaining'), interval = setInterval(function(){ 
 

 
     if(time/1 == time/1 && time) //if(!isNaN(time) && time>0) 
 
     { 
 
      elem.text(time--); 
 
     } 
 
     else 
 
     { 
 
      clearInterval(interval); 
 
      elem.text(0); 
 
     } 
 
     
 
    }, 1000); 
 
} 
 

 
enableTimer(5);
<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script> 
 

 
    <div id="qanda-timer-container"> 
 
     <div class="qanda-timer"> 
 
      <span id="qanda-time-remaining"></span> 
 
     </div> 
 
    </div>

Я упростил свой код до крайности и так легко читать.

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

function enableTimer(time, fn) 
 
{ 
 
    var elem = jQuery('#qanda-time-remaining'), interval = setInterval(function(){ 
 

 
     if(time/1 == time/1 && time) //if(!isNaN(time) && time>0) 
 
     { 
 
      elem.text(time--); 
 
     } 
 
     else 
 
     { 
 
      clearInterval(interval); 
 
      elem.text(0); 
 
      if(fn instanceof Function)//if fn is a function 
 
      { 
 
       fn();//call it 
 
      } 
 
     } 
 
     
 
    }, 1000); 
 
} 
 

 
enableTimer(5, function(){ alert('Time\'s up!'); });
<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script> 
 

 
    <div id="qanda-timer-container"> 
 
     <div class="qanda-timer"> 
 
      <span id="qanda-time-remaining"></span> 
 
     </div> 
 
    </div>

Смежные вопросы