Как лучше всего реализовать потребительский шаблон опроса в JavaScript

Фон

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

проблема

Возникла проблема, из-за которой мое JavaScript-приложение реализует шаблон " опрос потребителей" для получения данных по мере их появления. Проблема в том, что память сохраняется и растет в течение дня. Логика 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 ответ

У вас есть только одна копия 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);
};
Другие вопросы по тегам