2010-09-14 8 views
0

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

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

Проблема

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

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

Это разумный способ внедрение потребителя опроса в JavaScript? Кстати, я использую функцию ajax jQuery, которая, конечно, может иметь свои проблемы. Кроме того, я использую прокси-сервер 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); 
    }, 
... 
    }); 
); 
+0

Хотите просто опросить сервер? – Aillyn

+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); 
}; 
+0

Я не уверен, что получаю то, что вы говорите ... можете ли вы привести пример в коде? Кроме того, я не пытаюсь снизить утечку памяти; Я пытаюсь это устранить! –

+0

Конечно, я отредактирую с примера. – bcherry

+0

Спасибо за пример. Как было сказано ранее, я не вижу, как моя утечка памяти уходит. Я также должен добавить, что мои проблемы возникли без использования прокси. Любые другие мысли? –

 Смежные вопросы

  • Нет связанных вопросов^_^