Как остановить интервалы внутри тайм-аута при трансляции событий? - PullRequest
0 голосов
/ 08 мая 2018

В моем Angular 1.5 после того, как пользователь входит в свою учетную запись, у меня есть различные директивы, которые запускают свой интервал в течение тайм-аута.Например, у меня есть это UserEmailNotificationsCtrl в одной из директив для проверки новых писем:

var intervalPromise;

$timeout(function () {
  stopInterval();
  intervalPromise = $interval(function() {
       checkNewEmail();
  }, 30000);
}, 20000);

$scope.$on('event:stop-intervals', function() {
      stopInterval();
});

$scope.$on('$destroy', function() {
   stopInterval();
});

function stopInterval() {
  $interval.cancel(intervalPromise);
}

Если пользователь выйдет из системы, я передам событие, чтобы вышеуказанный интервал был остановлен, чтобы предотвратить 400Плохие запросы:

function logout() {
 $rootScope.$broadcast('event:stop-intervals');
}

Вышеуказанное работает отлично.Однако вот проблема, с которой я столкнулся:

В случае incase пользователь выходит из системы до того, как начнутся проверки интервала, так как он заключен в тайм-аут для запуска через 20 секунд, широковещательная передача event:stop-intervals пропущена.,В этих случаях интервал начинается после установленного времени ожидания и он не знает, что event:stop-intervals был запущен, чтобы остановить интервалы до этого.

Мой вопрос: Как я могу проверить, если event:stop-intervalsтрансляция была запущена до начала интервала в директивах?(или) Как директива может остановить запуск интервала, если event:stop-intervals был запущен даже до того, как была запущена проверка интервала с тайм-аутом?

1 Ответ

0 голосов
/ 08 мая 2018

Отмена $timeout обещания с использованием $timeout.cancel() в вашем stopInterval() методе исправит вашу проблему, поэтому интервалы даже не будут установлены:

var intervalPromise;

var tiemoutPromise = $timeout(function () {
  stopInterval();
  intervalPromise = $interval(function() {
       checkNewEmail();
  }, 30000);
}, 20000);

$scope.$on('event:stop-intervals', function() {
  stopInterval();
});

$scope.$on('$destroy', function() {
  stopInterval();
});

function stopInterval() {
  $timeout.cancel(tiemoutPromise);
  $interval.cancel(intervalPromise);
}
...