2014-02-25 34 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