Angularjs Chrome扩展-取消导航上的$interval
我有一个在Chrome扩展中实现的AngularJS应用程序。它使用内容脚本在用户导航时将自身注入到用户页面中。其中有一个$interval,它每N秒调用一次服务器,作为一种轮询机制,检查是否有新数据返回到客户端Angularjs Chrome扩展-取消导航上的$interval,angularjs,google-chrome-extension,google-chrome-app,Angularjs,Google Chrome Extension,Google Chrome App,我有一个在Chrome扩展中实现的AngularJS应用程序。它使用内容脚本在用户导航时将自身注入到用户页面中。其中有一个$interval,它每N秒调用一次服务器,作为一种轮询机制,检查是否有新数据返回到客户端 myInterval = $interval(function() { // calls back to server }, 30000); $scope.$on("$destroy", function() { if (angular.isDefined(myInt
myInterval = $interval(function() {
// calls back to server
}, 30000);
$scope.$on("$destroy", function() {
if (angular.isDefined(myInterval)) {
$interval.cancel(myInterval);
myInterval = undefined;
}
};
我注意到我们服务器上的流量在增加,所以我调查发现,由这段时间间隔触发的查询正在以比我们的用户在预期条件下可能触发的更高的速度猛击我们的服务器。例如,以每分钟200多个来自同一用户的请求的速率
即使在导航到新页面、关闭选项卡等之后,间隔似乎仍然有效。我逐渐了解到,监听$destroy并取消间隔会处理应用程序内的路由更改,但如何确保在用户进行正常浏览活动时取消间隔(因为在加载下一页时将创建一个新的间隔)要收听您所指的广告“正常浏览活动”,您可以在卸载前为
窗口的事件注册一个监听器
$window.onbeforeunload = function (evt) {
$interval.cancel(myInterval);
};
我尝试实现它,但它似乎没有启动。我正在放入$window.addEventListener('onbeforeunload',函数(evt){[在此处设置cookie]$interval.cancel(myInterval);});…当我导航时,cookie没有被设置。我让它像:$window.onbeforeunload=function一样启动……看起来它会工作,将继续测试,并在检查时标记为正确。与此同时,我有什么想法可以消除浮动的现有间隔吗?@AbeHendlish:关于addEventListener,你是对的
在卸载之前不为工作。我再次遇到这个问题,但我仍然不能接受事实(它不工作:)。我更新了我的答案。关于你现有的时间间隔,恐怕你无能为力。用户必须关闭浏览器窗口或重新加载扩展(但这取决于您在内容脚本中使用的确切代码,因此我也不能确定)。使用addEventListener
时,不应使用“on”前缀<代码>$window.addEventListener('beforeunload',函数(evt){},false)代码>应该有用。@jarrodek:你所说的addEventListener()
是正确的。然而,由于某种原因,卸载之前的I似乎没有被触发(其他事件通常使用addEventListener()
触发)。