路由更改后销毁角$ http成功/错误片段

时间:2015-05-15 09:49:56

标签: angularjs http angular-ui-router q

这个问题可以在这里看到:http://embed.plnkr.co/Qcw1YA/

我运行route1并且我有一个$ timeout函数。我快速切换到route2,然后显示来自route1的延迟代码。我想销毁在$ timeout函数中运行的任何代码,在实际情况下,这是$ http服务请求并显示来自先前路由的错误消息。

2 个答案:

答案 0 :(得分:1)

这里的解决方案是:自己清理干净。

Best Practices

  

...

     

将拆卸代码添加到控制器和指令
  控制器和指令在销毁之前发出事件。在这里,您有机会拆除插件和监听器,并且几乎执行垃圾收集。

     

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()