我需要每30秒调用$ http请求,因此我设置了一个计时器,但是在路由更改时,该计时器仍在后台运行
$scope.timer = function(){
$interval(function () {
$scope.refreshData();
}, 30000);
}
$http.get(serviceBase + 'users/test')
.then(function (res) {
$scope.dataForEdit = res.data;
angular.forEach($scope.dataForEdit.campaign_items, function(value, key){
if(value.bench_downloaded == false || value.bench_notified == false){
$scope.timer();
}
})
在状态更改时,我想破坏时间间隔,我在同一控制器中尝试过此操作,但我收到警报,但时间间隔仍在工作
$scope.$on('$destroy',function(){
alert('try');
$interval.cancel($scope.timer);
});
这里是工作中的plunker。尝试更改状态并在控制台中观看。间隔仍在工作。 我究竟做错了什么? thnx
答案 0 :(得分:1)
可能是这个意思:(添加了return语句,因此$ scope.timer成为间隔)
$scope.timer = function(){
return $interval(function () {
$scope.refreshData();
}, 30000);
}
答案 1 :(得分:1)
我认为您需要将承诺传递给$interval.cancel()
。尝试以下代码,
$scope.stop = '';
$scope.timer = function(){
$scope.stop = $interval(function () { // promise
$scope.refreshData();
}, 30000);
}
$scope.$on('$destroy',function(){
alert('try');
$interval.cancel($scope.stop);
});
检查plunker
答案 2 :(得分:1)
$ interval返回值用于取消间隔。您需要保留间隔返回值,并使用该值执行$ interval.cancel(theReturnValue);。
这是一个工作的小伙伴。当我更改为route2时,由于$ destroy而取消了间隔,并在转到route1时再次返回。您也可以随时调用destroyInterval()取消。
https://next.plnkr.co/edit/WjHzG08rWAoLfeSP
添加更多笔记。
不再需要$ scope.stop。如果http请求失败,您也应该销毁Interval(),因此添加.catch或错误回调。关键是要处理所有可能使该间隔进入错误状态的情况。