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



在我的 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指令如何阻止间隔启动?

stopInterval()方法中使用$timeout.cancel()取消$timeout承诺将解决您的问题,因此甚至不会设置间隔:

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);
}

相关内容

  • 没有找到相关文章

最新更新