2015-11-10 27 views
1

我有一個遞歸函數調用另一個異步函數,並在解決的承諾,幾秒鐘後再次調用自身:

$scope.gamePolling = function() { 
    if ($scope.getGames) { 
    $scope.getGameData().then(function() { 
     $timeout(function() { 
     $scope.gamePolling(); 
     }, 3000); 
    }); 
    } 
}; 

當改變路線/狀態(使用UI路由器),我認爲$範圍應該被銷燬,所以我可以使用關閉遞歸函數:

$scope.$on('destroy', function() { 
    $scope.getGames = false; 
}); 

然而,接下來的頁面中gamePolling功能不斷呼籲本身,因爲破壞內的斷點永遠不會被擊中。

所以我的問題是,爲什麼不是$銷燬觸發事件? 附:這在刪除$超時時也會發生,所以問題必須與遞歸有關。

我解決此問題得到,通過在$ stateChangeStart關閉gamePolling():

$scope.$on('$stateChangeStart', function() { 
    $scope.getGames = false; 
}); 

所以輪詢停止的$破壞事件似乎仍然沒有被觸發。

作爲一個小測試,狀態/控制AI所分配的當前$範圍爲$ rootScope變量,所以我可以檢查它是否在國家/控制器B摧毀:$rootScope.testScope = $scope;

當控制器B檢查$rootScope.testScope.$$destroyed ,它返回真實。所以看起來控制器A的$範圍被成功銷燬。但是,在$ rootScope.testScope中,我仍然可以訪問分配給$ scope的變量。

+2

一杯咖啡可能..嘗試改變'「destroy''爲'」 $ destroy'' – Minato

+1

這就是它!亞歷克斯打了你幾分鐘,但無論如何。 – Matt

回答

2

它是「$消滅」事件,不是「消滅」

,因爲你提到用正確的名稱和代碼,你缺少$符號前綴的情況下這是有趣。

希望它有幫助!

更新:如果你允許我,我建議你使用間隔而不是超時+遞歸函數。然後,您可以在$ destroy事件處理程序中「終止」時間間隔。

+0

...我一直在看這2天,完全錯過了這一點,思考的問題是複雜得多。非常感謝! 關於間隔:我實際上是從一個時間間隔來改變它,因爲內部方法做了一個後端請求,而在慢速連接時,這導致許多請求被髮送,即使還有一些待處理的請求。 – Matt