$ interval.cancel不会破坏http.get中的计时器

时间:2018-07-18 11:24:44

标签: angularjs

我需要每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

3 个答案:

答案 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或错误回调。关键是要处理所有可能使该间隔进入错误状态的情况。