如何最好地在JavaScript中实现轮询使用者模式

时间:2010-09-14 01:56:45

标签: javascript memory-leaks long-polling ajax-polling

背景

早在五月份,我在WebKit上报告了一个关于memory retention issue的问题。看起来这个问题可能是由于Web Inspector本身造成的,但我还是不相信。

问题

一个问题浮出水面,我的JavaScript应用程序实现了一个“Polling Consumer”模式,用于在数据可用时获取数据。问题在于记忆被保留并在一天中增长。 JavaScript逻辑如下:

  1. 获取数据并给我回电话
  2. 当我回电话处理数据时 然后执行第1步
  3. 这是在JavaScript中实现轮询使用者的合理方式吗?顺便说一下,我正在使用jQuery的ajax函数,当然这可能有它自己的问题。另外我使用jQuery代理作为成功处理程序,所以我认为通过范围保留应该不是问题。我没有使用代理也观察到了这个问题。一些代码:

    FidsDataController.prototype.getFids = function() {
      var self = this;
      $.ajax({
    ...
        success: function(data) {
          // Do some processing
          // Call back in a short while...
          setTimeout($.proxy(self.getFids, self), 100);
        },
    ...
      });
    );
    

1 个答案:

答案 0 :(得分:1)

你只有getFids的一个副本,这很好,但是每次调用它都会创建两个新函数:一个用于成功处理程序,另一个用于$.proxy调用。这两个函数并非每次调用都是唯一的。将它们放在可重复使用的变量中,您将节省大量额外的功能,这可以大大降低您的内存泄漏潜力。

我们在构造函数中为每个对象创建每个函数的代理版本的示例。重复调用不会产生更多功能:

function FidsDataController() {
  // ...constructor...


  // Proxy these functions just once from the prototype
  this.getFids = $.proxy(this.getFids, this);
  this._getFids_success = $.proxy(this._getFids_success, this);
}

FidsDataController.prototype.getFids = function() {
  var self = this;
  $.ajax({
    success: this._getFids_success;
  });
};

FidsDataController.prototype._getFids_success = function(data) {
  // processing of data
  setTimeout(this.getFids, 100);
};