Как лучше всего реализовать потребительский шаблон опроса в JavaScript - PullRequest
0 голосов
/ 14 сентября 2010

Фон

Еще в мае я сообщал о проблеме в WebKit, касающейся проблемы с удержанием памяти .Похоже, что проблема может быть связана с самим веб-инспектором, но я еще не убежден.

Проблема

Возникла проблема, в результате которой мое приложение JavaScript реализуетшаблон « Polling Consumer » для получения данных по мере их поступления.Проблема в том, что память сохраняется и растет в течение дня.Логика JavaScript выглядит следующим образом:

  1. Получите данные и перезвоните мне
  2. Когда мне перезвонят, обработайте данные и затем выполните шаг 1

Является ли это разумным способом реализации потребителя опроса в JavaScript?Между прочим, я использую функцию jjuery 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 Ответ

1 голос
/ 14 сентября 2010

У вас есть только одна копия 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);
};
...