AngularJS-递归函数禁用$scope.on('destroy')

AngularJS - Recursive function disables $scope.on('destroy')

本文关键字:destroy on 递归函数 scope AngularJS-      更新时间:2023-09-26

我有一个递归函数,它调用另一个异步函数,在解析promise后,几秒钟后再次调用自己:

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

当更改路由/状态(使用ui路由器)时,我认为$scope应该被销毁,这样我就可以使用关闭递归函数

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

但是,在下一页中,gamePolling函数会继续调用自己,因为destroy中的断点永远不会被命中。

所以我的问题是为什么$destroy事件没有被触发p.s.删除$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的变量。

这是"$destroy"事件,而不是"destroy"

这很有趣,因为您提到的事件名称正确,而代码中缺少$sign前缀。

希望它能有所帮助!

更新:如果你允许的话,我建议你使用一个间隔,而不是超时+递归函数。然后,您可以在$destroy事件处理程序中"终止"间隔。