这个问题可以在这里看到:http://embed.plnkr.co/Qcw1YA/
我运行route1并且我有一个$ timeout函数。我快速切换到route2,然后显示来自route1的延迟代码。我想销毁在$ timeout函数中运行的任何代码,在实际情况下,这是$ http服务请求并显示来自先前路由的错误消息。
答案 0 :(得分:1)
这里的解决方案是:自己清理干净。
...
将拆卸代码添加到控制器和指令
控制器和指令在销毁之前发出事件。在这里,您有机会拆除插件和监听器,并且几乎执行垃圾收集。
Subscribe to the $scope.$on('$destroy', ...) event
所以,而不是这个(有a updated plunker)
controller: function($timeout) {
$timeout(function() {
alert("Hey I'm message from route 1!");
}, 5000)
}
我们应该这样做:
controller: function($scope, $timeout) {
var removeTimer = $timeout(function() {
alert("Hey I'm message from route 1!");
}, 5000)
$scope.$on('$destroy', function(){
$timeout.cancel(removeTimer);
console.log('all cleared')
});
}
不说 - $ http已经取消......它将在稍后或更早来自服务器......
关键是,如果有任何鬼魂动作可以在repsonse到来时触发(在 .then()
内),我们应该清除它们或检查状态是否已经消失。 ..
检查here
答案 1 :(得分:0)
$timeout service in AngularJS返回Promise
,可以通过调用cancel
方法将其销毁。
//save the link to a promise
$rootScope.dataRequestPromise = $timeout(function() {
alert("Hey I'm message from route 1!");
}, 5000);
//resolve a promise
$rootScope.dataRequestPromise.cancel()