2012-05-13 3 views
3

Я хочу изменить setInterval время функции, когда мой код запущен.setInterval (функция(), время) время изменения во время выполнения

Я стараюсь это

<script type="text/javascript"> 
     $(function() { 
      var timer; 
      function come() { alert("here"); } 
      timer = setInterval(come, 0); 
      clearInterval(timer); 
      timer = setInterval(come, 10000); 
     }); 
    </script> 

Первый SetInterval не работает!

+0

Что значит «не работает»? –

+0

http://stackoverflow.com/a/29823252/1478566 – vbarbarosh

ответ

11

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

 timer = setInterval(come, 0); 
     clearInterval(timer); 
     timer = setInterval(come, 10000); 

Кроме того, как говорит gdoron, установив интервал ничего ISN Действительно, действительно, и не очень хорошая идея, используйте вместо этого setTimeout или просто запустите функцию сразу, если не требуется отсрочка.

 come(); 
     clearInterval(timer); 
     timer = setInterval(come, 10000); 
+0

, используя приведенный выше код, функция come() останавливается на одну секунду и снова запускается ... есть ли способ избежать остановки функции? .... – Naveen

1
timer = setInterval(come, 0); // zero isn't a valid interval... 

Вы, вероятно, хочет:

come(); 
timer = setInterval(come, 10000); 

документы на MDN:

задержка является количество миллисекунд (тысячных секунды), что функция setInterval() должен ждать перед каждым вызов функции func. Как и в случае с setTimeout, существует минимальная задержка.

И:

Исторически браузеры поддерживают SetTimeout() «зажим»: последовательное SetTimeout() вызывает с задержкой меньше, чем «минимальная задержкой» предел вынуждены использованием по крайней мере, минимальной задержка. Минимальная задержка, DOM_MIN_TIMEOUT_VALUE, составляет 4 мс (сохраняется в предпочтении в Firefox: dom.min_timeout_value), с DOM_CLAMP_TIMEOUT_NESTING_LEVEL в 5 мс.

+0

Несомненно, это так, почему бы и нет? –

+0

@GregHewgill. Документы ... – gdoron

+0

Ах, извините, я неправильно понял и думал о 'setTimeout()'. –

3

Вы не можете. Вам нужно будет использовать SetTimeout, и назовите его повторно:

var timer; // current timeout id to clear 
function come(){ /* do something */}; 
var time; // dynamic interval 

(function repeat() { 
    come(); 
    timer = setTimeout(repeat, time); 
})(); 

С помощью этого вы можете установить другой «интервал», которые должны применяться каждый раз, когда функция repeat выполняется. Тем не менее, ничего не меняется, если изменить time во время таймаута, вам нужно будет остановить таймаут для этого.

+1

Где находится таймер? – gdoron

+0

Спасибо, я пропустил очевидное ... – Bergi

+0

Спасибо, это то, что мне нужно. Возможно, вы можете добавить, что вы можете прервать цикл с помощью 'clearTimeout (timer);' in 'come();' – Sonic750

2

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

timer = { 
    timers:{}, 
    inc:0, 
    start:function(cb,gap) { 
     var key = inc; 
     inc++; 
     timer.timers[key] = [setInterval(cb,gap),cb]; 
     return key; 
    }, 
    stop:function(id) { 
     if(!timer.timers[id]) return; 
     clearInterval(timer.timers[id][0]); 
     delete timer.timers[id]; 
    }, 
    change:function(id,newgap) { 
     if(!timer.timers[id]) return; 
     clearInterval(timer.timers[id][0]); 
     setInterval(timer.timers[id][1],newgap); 
    } 
}; 

Использование:

var myTimer = timer.start(function() {....},1000); 
// calls every second 

timer.change(myTimer,5000); 
// now calls every five seconds 
0

Я знаю, что этот пост старый, но мне нужно что-то подобное, может быть, кому-то это нужно.

Это версия без setInterval, основанная на коде из другой реакции (Niet the Dark Absol).

function timer() 
{ 
    var timer = { 
     running: false, 
     iv: 5000, 
     timeout: false, 
     cb : function(){}, 
     start : function(cb,iv,sd){ 
      var elm = this; 
      clearInterval(this.timeout); 
      this.running = true; 
      if(cb) this.cb = cb; 
      if(iv) this.iv = iv; 
      if(sd) elm.execute(elm); 
      this.timeout = setTimeout(function(){elm.execute(elm)}, this.iv); 
     }, 
     execute : function(e){ 
      if(!e.running) return false; 
      e.cb(); 
      e.start(); 
     }, 
     stop : function(){ 
      this.running = false; 
     }, 
     set_interval : function(iv){ 
      clearInterval(this.timeout); 
      this.start(false, iv); 
     } 
    }; 
    return timer; 
} 

Использование:

var timer_1 = new timer(); 
timer_1.start(function(){ 
    //magic here 
}, 2000, false); 

var timer_2 = new timer(); 
timer_2.start(function(){ 
    //more magic here 
}, 3000, true); 

//change the interval 
timer_2.set_interval(4000); 

//stop the timer 
timer_1.stop(); 

Последний параметр функции запуска является булевой, если необходимо запустить на 0.

функция Вы также можете найти сценарий здесь: https://github.com/Atticweb/smart-interval

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