如何在事件广播中停止超时延迟内的间隔?

时间:2018-05-08 07:56:47

标签: angularjs angularjs-directive angular-broadcast

在我的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 Bad Request:

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

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

如果出现这种情况,用户会在间隔检查开始之前注销,因为它会在超时内被包装到20秒后开始,event:stop-intervals广播将被丢失。在这些情况下,间隔在设置超时后开始,并且不知道event:stop-intervals被触发以在此之前停止间隔。

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

1 个答案:

答案 0 :(得分: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);
}