Зупиніть встановити виклик інтернету в JavaScript


1398

Я використовую setInterval(fname, 10000);для виклику функції кожні 10 секунд у JavaScript. Чи можна перестати телефонувати на якусь подію?

Я хочу, щоб користувач міг зупинити повторне оновлення даних.

Відповіді:


2160

setInterval()повертає ідентифікатор інтервалу, який ви можете передати clearInterval():

var refreshIntervalId = setInterval(fname, 10000);

/* later */
clearInterval(refreshIntervalId);

Дивіться документи для setInterval()та clearInterval().


42
Як можна запустити його знову після припинення роботи з 'clearInterval ()'? Якщо я спробую її перезапустити, я отримаю 2x setInterval.
День

8
Я теж щоразу, коли я хочу використовувати SetInterval (MyFunction, 4000); це стає все швидше і швидше, кожен раз у 2 рази швидше :( як я можу перезапустити сетінтервал ??
Alireza Masali

14
SetInterval () не змінює швидкість, яку ви його проходите. Якщо все, що це робиться, прискорюється кожен раз, коли ви викликаєте SetInterval (), то у вас є кілька таймерів, які працюють одночасно, і слід відкрити нове запитання.
EpicVoyage

29
Переконайтесь, що ви справді зупиняєте це. Через змінне масштабування ви, можливо, не маєте права Id викликати clearInterval. Я використовував window.refreshIntervalIdзамість локальної змінної, і вона чудово працює!
osa

2
Я почав приєднувати ручку setInterval до пов'язаного з ним елемента (коли це доречно): $('foo').data('interval', setInterval(fn, 100));а потім очистивши його, clearInterval($('foo').data('interval'));я впевнений, що існує і спосіб, який не є jQuery.
Майкл - Де Clay Shirky

105

Якщо встановити значення повернення setIntervalзмінної, ви можете використовувати її clearIntervalдля зупинки.

var myTimer = setInterval(...);
clearInterval(myTimer);

Я не бачу різниці між цим та відповіддю Джона
Бобтроопо

51

Ви можете встановити нову змінну і збільшувати її на ++ (рахувати одну) щоразу, коли вона запускається, тоді я використовую умовний оператор, щоб закінчити її:

var intervalId = null;
var varCounter = 0;
var varName = function(){
     if(varCounter <= 10) {
          varCounter++;
          /* your code goes here */
     } else {
          clearInterval(intervalId);
     }
};

$(document).ready(function(){
     intervalId = setInterval(varName, 10000);
});

Я сподіваюся, що це допомагає і це правильно.


3
Я здивовано дізнався, що це працює clearInterval(varName);. Я очікував, clearIntervalщо не буде працювати, коли передав ім'я функції, я вважав, що потрібен ідентифікатор інтервалу. Я припускаю, що це може працювати, лише якщо у вас є названа функція, оскільки ви не можете передавати анонімну функцію як змінну всередині себе.
Патрік М

31
Насправді я думаю, що це не працює. Код припиняється виконувати через обмеження на лічильнику, але інтервал зберігає varName (). Спробуйте записати що-небудь після clearInterval () (усередині іншого пункту), і ви побачите, що це написано назавжди.
Рафаель Олівейра

5
Стільки нагород за те, що не працює, іноді я не розумію людей на SO: P
Stranded Kid

2
$(document).ready(function(){ });є jQuery, тому це не працює. Про це потрібно було принаймні згадати.
paddotk

4
@OMGrant, Окрім прикладу, який не працює, у вас є змінна назва varName, яка зберігає неназвану функцію - wha ?? Ви повинні змінити або зняти цю відповідь, ІМХО.
Дін Редкліфф

13

Наведені вище відповіді вже пояснювали, як setInterval повертає ручку і як ця ручка використовується для скасування таймера інтервалу.

Деякі архітектурні міркування:

Будь ласка, не використовуйте змінні "без області". Найбезпечніший спосіб - використовувати атрибут об’єкта DOM. Найпростіше місце було б "документом". Якщо оновлення запускається кнопкою пуску / зупинки, ви можете скористатися самою кнопкою:

<a onclick="start(this);">Start</a>

<script>
function start(d){
    if (d.interval){
        clearInterval(d.interval);
        d.innerHTML='Start';
    } else {
        d.interval=setInterval(function(){
          //refresh here
        },10000);
        d.innerHTML='Stop';
    }
}
</script>

Оскільки функція визначена всередині обробника кнопки, вам не потрібно її визначати знову. Таймер можна відновити, якщо кнопку знову натиснути.


1
Що краще в цьому, documentніж увімкнути window?
icktoofay

1
виправлення. Я мав на увазі сказати document.body. У прикладі коду я ефективно використовую саму кнопку. Для кнопки немає ідентифікатора, але вказівник "цей" пов'язаний з параметром "d" у функції. Використовувати "вікно" як сферу дії ризиковано, оскільки функцій також є. Наприклад, "test test () {}" доступний через window.test, що це те саме, що зовсім не використовувати область, тому що це скорочення. Сподіваюсь, це допомагає.
Schien

1
не втрачайте змінні "без обмежень" -> не використовуйте "без області", я б це відредагував, але зміна становить менше 6 літер, і помилка заплутана.
Лейф Неланд

2
Для цього вам не потрібен DOM. Просто ми МІФЕ, щоб уникнути забруднення глобального масштабу.
Onur Yıldırım

1
Я повинен додати 'd.interval = undefined' після innerhtml = 'start', щоб знов працювати. Тому що так просто працює один раз.
jocmtb

11

Вже відповів ... Але якщо вам потрібен функціональний таймер, що повторно використовується, який також підтримує декілька завдань на різних інтервалах, ви можете використовувати мію TaskTimer (для Вузла та браузера).

// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);

// Add task(s) based on tick intervals.
timer.add({
    id: 'job1',         // unique id of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (omit for unlimited times)
    callback(task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
        // stop the timer anytime you like
        if (someCondition()) timer.stop();
        // or simply remove this task if you have others
        if (someCondition()) timer.remove(task.id);
    }
});

// Start the timer
timer.start();

У вашому випадку, коли користувачі натискають, щоб порушити оновлення даних; Ви також можете зателефонувати timer.pause()тоді, timer.resume()якщо вони потребують повторного ввімкнення.

Детальніше дивіться тут .


6

Метод clearInterval () може бути використаний для очищення набору таймерів методом setInterval ().

setInterval завжди повертає значення ідентифікатора. Це значення можна передавати у clearInterval (), щоб зупинити таймер. Ось приклад таймера, починаючи з 30 і зупиняється, коли він стає 0.

  let time = 30;
  const timeValue = setInterval((interval) => {
  time = this.time - 1;
  if (time <= 0) {
    clearInterval(timeValue);
  }
}, 1000);

5

@cnu,

Ви можете зупинити інтервал, коли спробуйте запустити код, перш ніж подивитися браузер ур консолі (F12) ... спробуйте коментар clearInterval (тригер) - це знову подивитися консоль, а не красуня? : P

Перевірте приклад джерела:

var trigger = setInterval(function() { 
  if (document.getElementById('sandroalvares') != null) {
    document.write('<div id="sandroalvares" style="background: yellow; width:200px;">SandroAlvares</div>');
    clearInterval(trigger);
    console.log('Success');
  } else {
    console.log('Trigger!!');
  }
}, 1000);
<div id="sandroalvares" style="background: gold; width:200px;">Author</div>


3

Оголосити змінну, щоб призначити значення, повернене з setInterval (...), і передати призначену змінну до clearInterval ();

напр

var timer, intervalInSec = 2;

timer = setInterval(func, intervalInSec*1000, 30 ); // third parameter is argument to called function 'func'

function func(param){
   console.log(param);
}

// Де б ви не мали доступу до таймера, оголошеного вище, виклик clearInterval

$('.htmlelement').click( function(){  // any event you want

       clearInterval(timer);// Stops or does the work
});

1
var keepGoing = true;
setInterval(function () {
     if (keepGoing) {
        //DO YOUR STUFF HERE            
        console.log(i);
     }
     //YOU CAN CHANGE 'keepGoing' HERE
  }, 500);

Ви також можете зупинити інтервал, додавши слухача події, щоб сказати кнопку з ідентифікатором "інтервал зупинки":

$('buuton#stop-interval').click(function(){
   keepGoing = false;
});

HTML:

<button id="stop-interval">Stop Interval</button>

Примітка: Інтервал все одно буде виконуватися, хоча нічого не відбудеться.


2
Це дійсно повернулося до продуктивності, а для фонових вкладок, це фактично сповільнить усі інші таймери на багато, оскільки таймери та інтервали будуть
зменшені

1

Ось так я використав метод clearInterval (), щоб зупинити таймер через 10 секунд.

function startCountDown() {
  var countdownNumberEl = document.getElementById('countdown-number');
  var countdown = 10;
  const interval = setInterval(() => {
    countdown = --countdown <= 0 ? 10 : countdown;
    countdownNumberEl.textContent = countdown;
    if (countdown == 1) {
      clearInterval(interval);
    }
  }, 1000)
}
<head>
  <body>
    <button id="countdown-number" onclick="startCountDown();">Show Time </button>
  </body>
</head>


1

Використовуйте setTimeOut, щоб зупинити інтервал через деякий час.

var interVal = setInterval(function(){console.log("Running")  }, 1000);
 setTimeout(function (argument) {
    clearInterval(interVal);
 },10000);

0

Я думаю, що наступний код допоможе:

var refreshIntervalId = setInterval(fname, 10000);

clearInterval(refreshIntervalId);

Ви зробили код на 100% правильним ... Отже ... У чому проблема? Або це підручник ...


-3

Чому б не застосувати більш простий підхід? Додайте клас!

Просто додайте клас, який повідомляє інтервалу нічого не робити. Наприклад: на наведення курсора.

var i = 0;
this.setInterval(function() {
  if(!$('#counter').hasClass('pauseInterval')) { //only run if it hasn't got this class 'pauseInterval'
    console.log('Counting...');
    $('#counter').html(i++); //just for explaining and showing
  } else {
    console.log('Stopped counting');
  }
}, 500);

/* In this example, I'm adding a class on mouseover and remove it again on mouseleave. You can of course do pretty much whatever you like */
$('#counter').hover(function() { //mouse enter
    $(this).addClass('pauseInterval');
  },function() { //mouse leave
    $(this).removeClass('pauseInterval');
  }
);

/* Other example */
$('#pauseInterval').click(function() {
  $('#counter').toggleClass('pauseInterval');
});
body {
  background-color: #eee;
  font-family: Calibri, Arial, sans-serif;
}
#counter {
  width: 50%;
  background: #ddd;
  border: 2px solid #009afd;
  border-radius: 5px;
  padding: 5px;
  text-align: center;
  transition: .3s;
  margin: 0 auto;
}
#counter.pauseInterval {
  border-color: red;  
}
<!-- you'll need jQuery for this. If you really want a vanilla version, ask -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<p id="counter">&nbsp;</p>
<button id="pauseInterval">Pause</button></p>

Я шукав цей швидкий і простий підхід протягом століть, тому я розміщую кілька версій, щоб представити на ньому якомога більше людей.


17
Мені це не здається дуже простим ... Я також думаю, що чистіше видаляти інтервали, а не підтримувати дзвінки до функцій, які нічого не роблять.
Ромен Браун

Я не згоден. this.setInterval(function() { if(!$('#counter').hasClass('pauseInterval')) { //do something } }, 500);це все, що ви маєте для коду. Більше того, чек - це перше, що ви робите, тому він дуже легкий, коли його зависають. Саме для цього і полягає: тимчасове призупинення функції . Якщо ви хочете припинити його безстроково: звичайно, ви видалите інтервал.
Aart den Braber

Це означає голосування і, як правило, не рекомендується. Це розбудить процесор із станів малої потужності лише для того, щоб зробити (ймовірно) марну перевірку. У цьому прикладі також затримується зворотний зв'язок з негайним значенням від 0 до 500 мс.
Чарлі

Я цілком не згоден з вами, навіть коли я писав код 2 роки тому. Лічильник все одно повинен бути там, тому що ОП просив цього. Звичайно, якщо ви використовуєте це для зупинки лічильника після натискання кнопки, наприклад, це було б неоптимальним рішенням, але просто для паузи при наведенні курса - це одне з найпростіших доступних рішень.
Aart den Braber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.