递归轮询方法

时间:2017-01-24 13:37:47

标签: javascript angularjs recursion memory-leaks

需要解决的实际问题:我正在开发一个大型应用程序,其初始版本大约是两年前发布的。我们现在正在向应用程序添加一个新页面,并注意到一些奇怪的行为。新屏幕将成为“永远在线”状态屏幕,这意味着它是应用程序中的默认屏幕,应用程序运行的专用PC将始终显示在默认情况下。经过一段时间(在IE浏览器上只有几分钟,Chrome上通常要长得多),事情开始行为不端。首先,滚动消息(如果有的话)的动画变得不稳定和缓慢,最终到达它们看起来移动大约1个像素/秒的程度。在我们使用的机器上,IE中的碎片会在几分钟内开始,并且在几个小时内会慢慢爬行。到那时,其他奇怪的行为已经开始:浏览器本身反应迟钝。此屏幕上有一个菜单/登录按钮,在点击任何内容之前有3-4秒的延迟。其他视觉元素在更新之前具有类似的延迟,即使它们与用户没有交互。

我和团队中的其他人花了几天时间查看此页面上的所有内容,并且认为我们将原因缩小到我们用于轮询数据的服务中的内存泄漏。它出现在我们使用该服务的每个页面上,但我们认为症状只是新屏幕上的一个问题,因为有大量的视觉提示(滚动,更新图标/颜色等),许多它有一些密集的处理/图形,在数据更新时每个周期都会运行,并且事实上没有人可能让其他屏幕保持运行一段时间,可能需要开始以较少的时间看到症状勤奋的页面。

我在Chrome的开发者工具中采用了时间轴截图,这就是它的样子。在使用我们的轮询服务的每个页面上看起来类似。 This is what the graph looks like for the actual page.

我创建了一个demo of just the polling,并得到了一个类似的图表:Demo from plnkr。它在演示中看起来不那么严重,但模式显然是相似的,看起来像是内存泄漏。 我们如何解决内存泄漏并消除其他问题?

一些相关代码:

 var reload = function() {
      $http({
          method: 'GET',
          url: 'api.txt',
          timeout: 5000
        })
        .success(function(response) {
          //do stuff
        })
        .error(function(data) {
          //do other stuff
        })
        .finally(function() {
          timer = $timeout(reload, 1000);
        });
    };

1 个答案:

答案 0 :(得分:0)

你在代码中的某处使用了闭包吗? 由于这些类型的问题仅在使用许多闭包时发生,因为这是java脚本中不会销毁对象的地方,如果你使用太多闭包,最终你将缺少内存。