0

在我的 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');
}

以上工作正常。但是,这是我遇到的问题:

如果以防万一,用户在间隔检查开始之前注销,因为它被包裹在 20 秒后开始的超时中,则event:stop-intervals广播被错过。在这些情况下,间隔在设置的超时之后开始,并且不知道event:stop-intervals在此之前被触发以停止间隔。

我的问题是:如何event:stop-intervals在指令中开始间隔之前检查广播是否被触发?event:stop-intervals(或)如果在触发超时的间隔检查之前触发了指令,该指令如何阻止间隔开始?

4

1 回答 1

1

在您的方法中使用取消$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);
}

于 2018-05-08T10:49:13.460 回答