
21.05.2009, 15:49
|
Новичок на форуме
|
|
Регистрация: 21.05.2009
Сообщений: 5
|
|
Создание и уничтожение XMLHttpRequest
Хочу получить комментарии про следующий код:
function sendRequest (filePath, params, resultDivName) {
if (window.XMLHttpRequest) {
var xmlhr = new XMLHttpRequest();
} else {
var xmlhr = new ActiveXObject('MSXML2.XMLHTTP.3.0');
}
xmlhr.open('POST', filePath);
xmlhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhr.onreadystatechange = function() {
...
}
xmlhr.send(params);
}
Корректен-ли такой код?
При каждом вызове sendRequest создается новый экземпляр XMLHttpRequest. Когда уничтожается переменная xmlhr?
Не приведет-ли к утечке памяти многократный вызов sendRequest ?
Или лучше создать экземпляр XMLHttpRequest вне функции sendRequest, а в ней использовать один и тот же?
|
|

21.05.2009, 17:09
|
 |
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Vlas
|
Когда уничтожается переменная xmlhr?
|
для данного кода, после того как выполнится xmlhr.onreadystatechange
в общем случае, когда никто больше не ссылается на переменную(в том числе и замыкания)
Сообщение от Vlas
|
Не приведет-ли к утечке памяти многократный вызов sendRequest ?
|
если вы не сделаете ее глобальной, либо не сделаете ей новый контекст, который проживет дольше чем сам запрос, то должно удалатся автоматически сборщиком мусора.
реализация сборщика мусора индивидуальна для разных браузеров, но на данный момент во всех вроде бы все нормально по этому поводу.
говорить об утечках смысла нету.может быть только для осла, но он вроде бы для контекстов JS от этого излечился
точнее сказать не могу
Сообщение от Vlas
|
Или лучше создать экземпляр XMLHttpRequest вне функции sendRequest, а в ней использовать один и тот же?
|
лучше не стоит.
нарушается логика, и возможны непредвиденные ситуации, если что-то неаккуратно сделаете.
|
|

21.05.2009, 17:23
|
Новичок на форуме
|
|
Регистрация: 21.05.2009
Сообщений: 5
|
|
Сообщение от Gvozd
|
для данного кода, после того как выполнится xmlhr.onreadystatechange
|
Вот меня и смутило это. Ведь onreadystatechange может вызываться многократно. Откуда будет известно что это был последний вызов?
Сообщение от Gvozd
|
лучше не стоит.
нарушается логика, и возможны непредвиденные ситуации, если что-то неаккуратно сделаете.
|
Я так раньше делал. И, действительно, приходилось запрещать новые запросы до того как выполнился предыдущий запрос.
В любом случае спасибо за ответ.
|
|

21.05.2009, 17:34
|
 |
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Vlas
|
Ведь onreadystatechange может вызываться многократно.
|
хм.
я об этом не подумал.
в случае обычного замыкания, после последнего выполнения последнего onreadystatchange должен вызыватся сборщик мусора, если внутри не были определены новые функции в глобальной области видимости.
но вполне возможно, что IE может страдать такого рода утечками.
более ранние версии его страдали утечками, в случае обработчиков DOM-событий. это было связано с реализацией взаимодействия DOM-javascript
по поводу же этого случая не уверен.
советую внимательно погуглить на эту тему.
вы собираетесь писать чисто ajax-приложение, работающее максимально в реалтайме?
|
|

21.05.2009, 18:38
|
Новичок на форуме
|
|
Регистрация: 21.05.2009
Сообщений: 5
|
|
Сообщение от Gvozd
|
советую внимательно погуглить на эту тему.
|
В результате гугления я и пришел на этот сайт. Где нашел много интересного
Сообщение от Gvozd
|
вы собираетесь писать чисто ajax-приложение, работающее максимально в реалтайме?
|
Как раз нет. Я не сторонник засовывать AJAX где попало. Иногда использую AJAX для проверки/загрузки некоторых данных.
Обычно я создаю один экземпляр XMLHttpRequest и использую его в разных запросах. Просматривая скрипты на Гугл-код я увидел такую конструкцию (что описал выше) и она мне понравилась, т.к. проще моих скриптов. Но меня смутил вопрос который я и задал в теме.
|
|

22.05.2009, 00:27
|
 |
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Немного кроссбраузерности содранной с Microsoft AJAX Framework. Уж они сами-то точно знают, как не допустить утечек памяти в их нем же браузере.
Request: Class.create({
initialize: function(url, options) {
// ...
this.initialized = true;
},
handleStateChange: function() {
if (this.xhr.readyState < 4 || this.responseAvailable) return;// это также полезно и для Opera8 для которой это событие при this.xhr.readyState == 4 может срабатывать дважды. Из-за этой строки ответ будет обработан только один раз
this.responseAvailable = true;
// ...
},
complete: function() {
if (this.completed) return this;
this.completed = true;
try {
this.xhr.onreadystatechange = Function.blank;// здесь у них добавляется не null, а пустая функция
this.responseAvailable || this.initialized && this.xhr.abort();// т. е. метод abort вызывается только если запрос уже послан (this.initialized == true) но ответ еще не получен (this.responseAvailable == false)
} catch (err) {}
// ...
}
})
Последний раз редактировалось Riim, 22.05.2009 в 00:57.
|
|

22.05.2009, 11:09
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Обычно, чтобы избежать утечек памяти, onreadystatechange вообще не устанавливают, а проверяют readyState по таймауту.
|
|

22.05.2009, 12:11
|
 |
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
т.е. без setTimeout нельзя избежать утечек? Или когда можно без него обойтись и как?
Последний раз редактировалось x-yuri, 22.05.2009 в 12:13.
|
|

22.05.2009, 12:18
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Я специально не исследовал этот вопрос. Просто, чтобы уж наверняка, onreadystatechange не устанавливаю.
|
|

22.05.2009, 12:38
|
 |
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Я специально тоже не исследовал, но в разных фреймворках этот способ стал появляться все чаще.
|
|
|
|