我已经阅读了文档,但现在是凌晨3点,我就在结束了。这是我的控制器:
controller('makeDashCtrl', function ($scope, $rootScope, $cookies, $location, $http, $interval) {
var userId = $cookies.get('user_id');
var orgId = $cookies.get('org_id');
$http.get('/api/consolidateProfile/').then(function(data){
console.log(data);
}, function(res){
console.log(res + " - Eh, consolidateProfile probably timed out, no biggie")
})
var testStart = $interval(function(){
$http.get('/api/testProgress/' + userId).then(function(obj){
$scope.message = obj.data.message;
$scope.sub = obj.data.sub;
if(obj.data.nextPhase){
console.log("Should be cancelling...");
nextScrape();
$interval.cancel(testStart); // This one cancels fine
}
}, function(err){
$interval.cancel(testStart);
});
}, 1000);
function nextScrape(){
console.log("In checkScraperadsfsdfads!")
var checkScraper = $interval(function(){
console.log("In checkScraper REAL!")
$http.get('/api/checkScraper/' + userId).then(function(obj){
var msg = JSON.parse(obj.data);
console.log("Got some data!")
console.log(obj);
if(msg.doneFbs){
$scope.fbMsg = "We've finished gathering " + msg.doneFbs + " Facebook accounts";
}
if(msg.doneTwits){
$scope.twitMsg = "We've finished gathering " + msg.doneTwits + " Twitter accounts";
}
$scope.message = msg.message;
$scope.sub = msg.sub;
if(msg.finished){
$interval.cancel(checkScraper); // This does NOT cancel
console.log("Scraping Done!")
$location.path('/dashboard') // This successfully redirects to the next page
}
},function(err){
console.log("There was an error in Checkscraper ")
console.log(err)
$interval.cancel(checkScraper); // This does NOT cancel when there's an error
});
}, 3000)
}
})
请参阅上面代码中的注释。也许这是nextScrape()
函数中的一个问题,但我不能让$interval
取消。即使$location.path()
更改为下一页,间隔仍在运行。
我在这里做错了什么?
答案 0 :(得分:1)
我怀疑代码在接收来自Ajax的响应之前正在进行多次调用。这意味着你的ajax需要超过一秒的时间来响应。这种情况正在发生,因为您已经提到了从服务器再次汇集数据的时间非常少。
要停用$interval
页面后重定向,您可以在$destroy
上使用scope
事件。需要手动清除事件,因为在我们分离之前它们不会消失。您可以在离开页面时停止间隔。销毁范围事件
<强>代码强>
$scope.$on('$destroy', function(){
$interval.cancel(testStart);
})
答案 1 :(得分:1)
如果您的通话需要超过一秒的时间,您可能会一次有多个ajax请求。如果您需要在第一次通话完成时,为什么不拨打一个电话并使用$interval
来安排第二次通话,而不是使用$tiemout
?
function checkProgress() {
$http.get('/api/testProgress/' + userId).then(function(obj){
$scope.message = obj.data.message;
$scope.sub = obj.data.sub;
if(obj.data.nextPhase){
// move on to next phase
nextScrape();
} else {
// not done, schedule another check
$timeout(checkProgress, 1000);
}
}, function(err){
// error, you cancel, but maybe schedule another progress check?
});
}