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

Фон

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

Проблема

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

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

Является ли это разумным способом реализации потребителя опроса в 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);
    },
...
  });
);

person Christopher Hunt    schedule 14.09.2010    source источник
comment
Вы просто хотите опросить сервер для данных?   -  person Aillyn    schedule 14.09.2010
comment
Мне нужно постоянно опрашивать сервер в соответствии с опросом потребителя. Идея состоит в том, что сервер блокируется до тех пор, пока запрос не станет доступным. Клиент либо получает данные, когда они становятся доступными, либо истекает время ожидания, если сервер умирает.   -  person Christopher Hunt    schedule 14.09.2010


Ответы (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);
};
person bcherry    schedule 14.09.2010
comment
Я не уверен, что понимаю, о чем вы говорите... можете ли вы привести пример в коде? Кроме того, я не пытаюсь уменьшить утечку памяти; Я пытаюсь устранить это! - person Christopher Hunt; 14.09.2010
comment
Спасибо за пример. Как уже говорилось ранее, я не вижу, чтобы моя утечка памяти исчезла. Я также должен добавить, что мои проблемы возникали и без использования прокси. Любые другие мысли? - person Christopher Hunt; 14.09.2010
comment
Ну, я не думаю, что вы можете многое сделать, чтобы полностью устранить утечки в JavaScript. Вы также можете попробовать переместить 100 и литерал объекта, переданный функции $.ajax, в статические свойства, если это может помочь. Однако, вероятно, есть что-то еще, что не ясно из этого примера. - person bcherry; 14.09.2010
comment
Итак, позвольте мне спросить вас по-другому: если бы вы реализовали потребителя с опросом, сделали бы вы это так, как это сделал я? - person Christopher Hunt; 14.09.2010
comment
Вы должны изучить методы Comet, такие как длинный опрос и веб-сокеты. - person bcherry; 14.09.2010