Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.05.2009, 15:49
Новичок на форуме
Отправить личное сообщение для Vlas Посмотреть профиль Найти все сообщения от Vlas
 
Регистрация: 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, а в ней использовать один и тот же?
Ответить с цитированием
  #2 (permalink)  
Старый 21.05.2009, 17:09
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Vlas
Когда уничтожается переменная xmlhr?
для данного кода, после того как выполнится xmlhr.onreadystatechange
в общем случае, когда никто больше не ссылается на переменную(в том числе и замыкания)
Сообщение от Vlas
Не приведет-ли к утечке памяти многократный вызов sendRequest ?
если вы не сделаете ее глобальной, либо не сделаете ей новый контекст, который проживет дольше чем сам запрос, то должно удалатся автоматически сборщиком мусора.
реализация сборщика мусора индивидуальна для разных браузеров, но на данный момент во всех вроде бы все нормально по этому поводу.
говорить об утечках смысла нету.может быть только для осла, но он вроде бы для контекстов JS от этого излечился
точнее сказать не могу
Сообщение от Vlas
Или лучше создать экземпляр XMLHttpRequest вне функции sendRequest, а в ней использовать один и тот же?
лучше не стоит.
нарушается логика, и возможны непредвиденные ситуации, если что-то неаккуратно сделаете.
Ответить с цитированием
  #3 (permalink)  
Старый 21.05.2009, 17:23
Новичок на форуме
Отправить личное сообщение для Vlas Посмотреть профиль Найти все сообщения от Vlas
 
Регистрация: 21.05.2009
Сообщений: 5

Сообщение от Gvozd Посмотреть сообщение
для данного кода, после того как выполнится xmlhr.onreadystatechange
Вот меня и смутило это. Ведь onreadystatechange может вызываться многократно. Откуда будет известно что это был последний вызов?


Сообщение от Gvozd Посмотреть сообщение
лучше не стоит.
нарушается логика, и возможны непредвиденные ситуации, если что-то неаккуратно сделаете.

Я так раньше делал. И, действительно, приходилось запрещать новые запросы до того как выполнился предыдущий запрос.

В любом случае спасибо за ответ.
Ответить с цитированием
  #4 (permalink)  
Старый 21.05.2009, 17:34
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Vlas
Ведь onreadystatechange может вызываться многократно.
хм.
я об этом не подумал.
в случае обычного замыкания, после последнего выполнения последнего onreadystatchange должен вызыватся сборщик мусора, если внутри не были определены новые функции в глобальной области видимости.
но вполне возможно, что IE может страдать такого рода утечками.
более ранние версии его страдали утечками, в случае обработчиков DOM-событий. это было связано с реализацией взаимодействия DOM-javascript
по поводу же этого случая не уверен.
советую внимательно погуглить на эту тему.
вы собираетесь писать чисто ajax-приложение, работающее максимально в реалтайме?
Ответить с цитированием
  #5 (permalink)  
Старый 21.05.2009, 18:38
Новичок на форуме
Отправить личное сообщение для Vlas Посмотреть профиль Найти все сообщения от Vlas
 
Регистрация: 21.05.2009
Сообщений: 5

Сообщение от Gvozd Посмотреть сообщение
советую внимательно погуглить на эту тему.
В результате гугления я и пришел на этот сайт. Где нашел много интересного

Сообщение от Gvozd Посмотреть сообщение
вы собираетесь писать чисто ajax-приложение, работающее максимально в реалтайме?
Как раз нет. Я не сторонник засовывать AJAX где попало. Иногда использую AJAX для проверки/загрузки некоторых данных.

Обычно я создаю один экземпляр XMLHttpRequest и использую его в разных запросах. Просматривая скрипты на Гугл-код я увидел такую конструкцию (что описал выше) и она мне понравилась, т.к. проще моих скриптов. Но меня смутил вопрос который я и задал в теме.
Ответить с цитированием
  #6 (permalink)  
Старый 22.05.2009, 00:27
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 22.05.2009, 11:09
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Обычно, чтобы избежать утечек памяти, onreadystatechange вообще не устанавливают, а проверяют readyState по таймауту.
Ответить с цитированием
  #8 (permalink)  
Старый 22.05.2009, 12:11
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

т.е. без setTimeout нельзя избежать утечек? Или когда можно без него обойтись и как?

Последний раз редактировалось x-yuri, 22.05.2009 в 12:13.
Ответить с цитированием
  #9 (permalink)  
Старый 22.05.2009, 12:18
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Я специально не исследовал этот вопрос. Просто, чтобы уж наверняка, onreadystatechange не устанавливаю.
Ответить с цитированием
  #10 (permalink)  
Старый 22.05.2009, 12:38
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Я специально тоже не исследовал, но в разных фреймворках этот способ стал появляться все чаще.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XMLHttpRequest серверная часть mmfStudent Серверные языки и технологии 7 14.04.2009 01:52
Повторное создание iframe Smoke Events/DOM/Window 7 07.02.2009 15:14
Повторное использовнаие XMLHttpRequest ViZ Общие вопросы Javascript 3 05.02.2009 13:11
XMLHTTPRequest и REadyState _Shasha_ AJAX и COMET 0 10.10.2008 09:00
XMLHTTPRequest POST метод gaolong Общие вопросы Javascript 7 30.06.2008 13:47