Очистка вложенного setInterval?

Возникли проблемы с очисткой setInterval, который вложен в другой setInterval.

polling очищается просто отлично, но marque (который установлен глобально) продолжает стрельбу, хотя очищенный выплевывается в консоль несколько раз.

listener: function() {
    var polling;

    journalScroll.on('scrollEnd', function() {
        clearInterval(polling);
        Roots.common.journal.scroll.status();
        console.log('scrollend');
    });

    journalScroll.on('scrollStart', function() {
      polling = setInterval(Roots.common.journal.scroll.status, 1250); // Time in milliseconds
      console.log('scrollstart');
    });
},

status: function() {
  console.log('scroll status');

  if((journalScroll.y*-1) < $(window).height() * 3) {
    console.log('setinterval');
    marque = setInterval(function() {
      Roots.common.journal.scroll.marque();
    }, 50);
  } else {
    clearInterval(marque);
    console.log('cleared');
  }
},

marque: function() {
  console.log('polling marque');        
},

1 ответ

Решение

setInterval просто возвращает идентификатор (целое число) и будет пытаться запустить таймер на неопределенный срок, пока вы не передадите этот же идентификатор обратно clearInterval функция. Из-за относительно непредсказуемой природы событий и асинхронной функциональности, вызовы и обратные вызовы часто могут привести к условиям гонки.

Например, ваш код может создавать новый интервал и назначать другой идентификатор marque переменная до того, как старый интервал был очищен - это приводит к тому, что он становится "осиротевшим", поскольку он все еще работает, и у вас нет идентификатора, с которым можно его отменить.

Не видя весь ваш код, самый простой способ "исправить" проблему - слепо clearInterval(marque); до тебя setInterval в вашем status функция - обеспечение того, чтобы в этом случае был активен только один интервал в любой момент времени.

Другие вопросы по тегам