我有一个递归函数调用另一个异步函数,并在解析promise后几秒后再次调用自己:
$scope.gamePolling = function () {
if ($scope.getGames) {
$scope.getGameData().then(function () {
$timeout(function () {
$scope.gamePolling();
}, 3000);
});
}
};
当改变路由/状态(使用ui-router)时,我认为$ scope应该被销毁,所以我可以使用以下命令关闭递归函数:
$scope.$on('destroy', function () {
$scope.getGames = false;
});
然而,在下一页中,gamePolling函数不断调用自身,因为destroy中的断点永远不会被击中。
所以我的问题是为什么没有触发$ destroy事件? 附:删除$ timeout时也会发生这种情况,因此问题必须与递归有关。
通过关闭$ stateChangeStart中的gamePolling(),我解决了这个问题:
$scope.$on('$stateChangeStart', function () {
$scope.getGames = false;
});
因此,轮询停止但 $ destroy事件似乎仍无法触发。
作为一个小测试,在状态/控制器A中,我将当前$ scope分配给$ rootScope变量,以便我可以检查它是否在状态/控制器B中被销毁:$rootScope.testScope = $scope;
检查控制器B中的$rootScope.testScope.$$destroyed
时,它返回 true 。所以看起来控制器A的$ scope被成功销毁了。但是,在$ rootScope.testScope中,我仍然可以访问分配给$ scope的变量。
答案 0 :(得分:2)
它是" $ destroy"事件,而不是"销毁"
这很有趣,因为你提到了具有正确名称的事件,并且在代码中你缺少$符号前缀。
希望它有所帮助!
更新:如果你允许我,我建议你使用间隔而不是超时+递归功能。然后你可以杀死" $ destroy事件处理程序中的间隔。