2014-02-25 59 views
4

我想了解角度服务和组件的生命周期。有角度的承诺能活多久?

说我有一个使用一个http服务的控制器:

function MyController($scope, $http) { 
    $http.get('/service').success(function(data) { 
    // handle the response 
    }); 
} 

的事情是,该控制器可被连接到的视图。我想确保如果视图已被删除,响应将被丢弃,这是为了防止与可能在应用程序的其他部分触发的其他请求发生冲突。控制器的实例是否会被销毁,并且如果视图被删除,来自$http服务的未决呼叫将被取消?例如,当用户从页面导航(不重新加载)导致新节的Javascript呈现?

[编辑]我创建了一个jsfiddle这表明,至少在$超时服务,挂起的操作仍然是$scope通过导航离开后销毁运行。是否有一种简单的方法将异步操作附加到作用域,以便它们自动销毁?

+0

你为什么不考呢?因为它是您需要提供更多关于您的应用程序的信息才能得出确凿的答案。 – ocodo

+0

完成:http://jsfiddle.net/ADukg/4839/。我编辑了这个问题以包含我所尝试的内容。 –

+0

你还没有真正解释你的控制器的生命周期。只要您的管理员居住,您的范围就会生活。你的控制器只要在DOM中并且在Angular中注册('ng-if'和'ng-view',路由就会销毁DOM并重建它的新实例,'ng-show'不会)。 AJAX服务是AJAX服务:调用将在浏览器的内存中生存,避免垃圾收集,在关闭中,直到没有更多的引用。也就是说:$ scope在调用完成之前不能被GCd调用,直到控制器不存在,调用才能被GCd ... – Norguard

回答

2

首先,附上对您的承诺的引用,然后将该引用传递给cancel函数。这通过拒绝解决了承诺。所以,你也可以只使用promise.reject()代替cancel(promise)

function MyController($scope, $http) { 
    var promise = $http.get('/service'); 

    promise.success(function(data){ 

    }); 

    $scope.$on(
     "$destroy", 
     function() { 
      promise.reject("scope destroyed, promise no longer available"); 
     } 
    ); 
} 
+0

这不适用于我的角度应用程序。有一个JavaScript错误说功能不可用。那么取消来自哪里?你的意思是$ timeout.cancel()? – Sebastian

+0

这是一段时间,所以不完全确定,但这将是我的猜测。因为它符合Promise/A +标准,所以我今天对承诺对象使用'reject()'。我会编辑我的答案。 –

+0

好的,这个答案是可以接受的:+1: – Sebastian