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