2014-09-24 54 views
0

我写了一个工厂长时间轮询,启动和停止方法。但是,我无法取消定时器。有任何想法吗?

app.controller("AuthCtrl", function($scope, $http, $window, User, Poller) { 
    Poller.start(1, $scope.session.user.user_uuid, function(result) { 
     User.data.queues.montage_progress = result.field; 
     if (result.field == 100) { 
     Poller.stop(); //DOES NOT STOP (see below) 
     } 
    }); 
    }) 

这里是工厂:

app.factory('Poller', function($http, $q, $interval, $window) { 
    var poll = this; 
    poll.timer = null; 

    poll.checkProgress = function(field, user_uuid) { 
    var deferred = $q.defer(); 
    $http({ 
     method: 'GET', 
     url: '/api/v1/poll/', 
     json: true, 
     params: { 
     field: field, 
     user_uuid: user_uuid 
     } 
    }) 
     .success(function(data) { 
     deferred.resolve(data); 
     }).error(function() { 
     deferred.reject("Error checking poll"); 
     }); 

    return deferred.promise; 
    }; 

    poll.start = function(url, user_uuid, callback) { 
    poll.timer = $interval(function() { 
     poll.checkProgress(url, user_uuid).then(function(result) { 
     console.log(result); 

     callback(result); 
     }, function(error) { 
     alert(error); 
     }); 
    }, 2000); 
    }; 

    poll.stop = function() { 
    $interval.cancel(poll.timer); 
    }; 
    return poll; 
}); 

编辑: 改变$window.clearInterval$interval.cancel(poll.timer);如下建议。但仍然无法取消投票...

+0

张贴完全相同的控制器代码,因为它是在你的JavaScript文件?因为如果是这样,我想你可能会在控制器定义的末尾丢失一个尾随的');'。 – pje 2014-09-24 22:03:34

回答

3

您应该使用的$intervalcancel方法,不clearInterval

poll.stop = function() { 
    $interval.cancel(poll.timer): 
}; 
+0

谢谢 - 它仍然不会停止。我检查了https://docs.angularjs.org/api/ng/service/$interval,但无法弄清楚什么是错的。 – metalaureate 2014-09-24 20:57:39

+0

嗯,你确定你的'poll.stop'函数被调用? – 2014-09-24 21:17:27

+0

是的,我有一个突破点。但它在.start回调中。这很重要吗?让我更新.stop代码示例。 – metalaureate 2014-09-24 21:20:46