Угловой $ интервал отменяется после превышения параметра count?

Краткий вопрос об услуге $interval в угловых. Просматривая документы ( $interval), они предупреждают вас об отмене интервалов вручную, но у вас есть возможность указать параметр count при инициализации. После того, как таймер "помечен" прошедшим отсчетом, он отменяет себя или просто прекращает вызывать функцию и продолжает жить в фоновом режиме?

1 ответ

Решение

Как сказано в той же документации, рекомендуется отменить интервал $, когда область действия вашего контроллера нарушена. Что-то вроде:

var t = $interval(function(){
    ...
}, 1000);


$scope.$on('$destroy', function(){
    $interval.cancel(t);
});

Параметр задержки - это интервал времени, в течение которого вызывается функция. В приведенном выше примере функция вызывается каждые 1000 миллисекунд. Если вы не отмените интервал $, Angular сохранит ссылку на него и может продолжить выполнять вашу функцию, вызывая странное поведение в вашем приложении.

Учитывая, что поставщик $interval - это просто оболочка встроенного метода setInterval(), с добавлением $apply, обращаясь к реализации Angular ( https://github.com/angular/angular.js/blob/master/src/ng/interval.js), мы можем найти этот фрагмент кода:

if (count > 0 && iteration >= count) {
  deferred.resolve(iteration);
  clearInterval(promise.$$intervalId);
  delete intervals[promise.$$intervalId];
}

Таким образом, обещание, созданное провайдером, разрешается, а интервал очищается. Метод отмены делает это:

intervals[promise.$$intervalId].reject('canceled');
$window.clearInterval(promise.$$intervalId);
delete intervals[promise.$$intervalId];

Итак, я думаю, что ваше предположение верно. После подсчета интервал уже очищен.

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