Очистить все setIntervals

Я использую setIntervals в функции each() вот так

$(".elements").each(function() {
    setInterval(function() {

    }, 1000);
});

Очевидно, что setIntervals создается для каждого элемента.

Мой вопрос: как очистить все setIntervals, когда они мне больше не нужны? Я попытался сохранить setInterval в переменной и вызвать window.clearInterval(int), но это очищает только последний setInterval, поскольку каждая переменная переопределяется.


person Community    schedule 08.12.2015    source источник
comment
Вы можете поместить каждый идентификатор интервала в массив, а затем перебрать его, когда захотите их очистить...   -  person Josh Crozier    schedule 09.12.2015
comment
Возможно, это может вам помочь: stackoverflow.com/ вопросы/8635502/   -  person Franco    schedule 09.12.2015


Ответы (7)


Когда вы устанавливаете интервал, вы получаете указатель на него:

var myInterval = setInterval(function(){}, 4000);

Если вы хотите отменить интервал, вы делаете следующее:

clearInterval(myInterval); 

Итак, для того, что вы хотите сделать, вы должны сделать следующее:

var intervals = [];
$(".elements").each(function() {
    var i = setInterval(function() {

    }, 1000);
    intervals.push(i);
});

Затем, если вам нужно отменить их все, вы можете сделать это:

intervals.forEach(clearInterval);

Это должно сделать это за вас.

person frosty    schedule 08.12.2015
comment
Нет. Вам нужно будет заменить for each циклом for или циклом lodash или jquery. - person frosty; 09.12.2015

Нет функции "очистить все интервалы".

Вам нужно будет сохранить их все и очистить их все:

var ints = [];

$(".elements").each(function() {
  ints.push( setInterval(function() {

             }, 1000) 
  );
});

// later

for ( var i = 0; i < ints.length; ++i )
  clearInterval( ints[i] );

ints = [];   // and forget them
person Paul Roub    schedule 08.12.2015

var clearAllIntervals = function ( ) {

    var intervals = [];

    $(".elements").each(function() {
        intervals.push( setInterval(function() {

        }, 1000) );
    });

    return function clearAll ( ) {
        intervals.forEach( clearInterval );
    }

}( );

// When you want to clear them:
clearAllIntervals( );

Если вы хотите быть совместимым с IE8 или ниже, вам следует shim .forEach, или замените его библиотечным эквивалентом или простым циклом.

person Paul    schedule 08.12.2015

Поскольку каждый интервал связан с элементом, вы можете сохранить идентификатор интервала в элементе:

$(".elements").each(function() {
  $(this).data('interval-id', setInterval(function() {
    // ...
  }, 1000));
});

Затем, если вы хотите очистить интервалы,

$(".elements").each(function() {
  clearInterval($(this).data('interval-id'));
});
person Oriol    schedule 08.12.2015

Я не рекомендую вам использовать это решение, но оно действительно помогает. Идея в том, чтобы переопределить функцию setInterval для сбора всех ссылок на setInterval:

(function(originalSetInterval){
    var intervals = [];
    window.setInterval = function(func, timeout) {
        var newInterval = originalSetInterval(func, timeout);
        intervals.push(newInterval);
        return newInterval;
    }

    window.clearAllIntervals = function() {
        intervals.forEach(clearInterval);
    }
})(window.setInterval)

Чтобы сделать работу лучше, вам также потребуется переопределить clearInterval, чтобы удалить все уже очищенные интервалы:

(function(originalSetInterval, originalClearInterval){
    var intervals = [];
    window.setInterval = function(func, timeout) {
        var newInterval = originalSetInterval(func, timeout);
        intervals.push(newInterval);
        return newInterval;
    }

    window.clearInterval = function(interval) {
        originalClearInterval(interval);
        intervals.splice(intervals.indexOf(interval), 1)
    }

    window.clearAllIntervals = function() {
        intervals.forEach(clearInterval);
    }
})(window.setInterval, window.clearInterval)
person Dmitry    schedule 08.12.2015

Это сработало для меня:

// clear interval
var id = window.setInterval(function() {}, 0);
while (id--) {
window.clearInterval(id);
person Anshul Singh    schedule 03.07.2020

Когда вы устанавливаете интервал, вы получаете указатель на него.
Чтобы очистить все интервалы, вам нужно сохранить их все:

var arr = [];
arr.push(setInterval(function () {
    console.log(1);
  }, 1000));
arr.push(setInterval(function () {
    console.log(2);
  }, 1000));
arr.push(setInterval(function () {
    console.log(3);
  }, 1000));

Следующий цикл очистит все интервалы

// Clear multiple Intervals
  arr.map((a) => {
    console.log(a)
    clearInterval(a);
    arr = [];
  })
person ashish siddhu    schedule 30.07.2020