2014-02-04 3 views
4

Я пишу приложение браузера, который был бы полностью AJAX инициативы (первый раз в жизни), что означает:XMLHttpRequest - освобождение после использования?

  • это будет одна страницы оставаться в браузере, компоненты загрузки программы при необходимости
  • история браузера будет, ну, нет.
  • страница не будет обновляться на всех

Меня беспокоит то, что я должен делать запросы XMLHttpRequest, так как я в основном C++ программист, преподается, что когда вы пишете заявление, как

x = new XMLHttpRequest(); 

вам нужно после этого delete.

Этот вопрос полностью посвящен управлению памятью, остается ли этот объект, выделенный new, в памяти, даже после того, как он завершает его «цикл» с помощью readyState == 4 или каким-то образом выпущен, освобожден, whatchacallit? Честно говоря, я понятия не имею, в какой момент он может быть освобожден, так как сценарий, создающий их, будет в HEAD и сидит там потенциально весь рабочий день. Будь я должен:

  • создать один или несколько, повторно использовать объекты типа XMLHttpRequest, программа приложение так, что не нужно будет больше, чем этот предел,
  • или это не имеет значения, и я могу выделить как много новых XMLHttpRequests, как мне нравится?

Пожалуйста, включите в свои ответы, в какой момент и ПОЧЕМУ эти объекты будут удалены, если они вообще будут, учитывая, что «кадр» моей веб-страницы останется. Надеюсь, я сделал этот вопрос ясным и благодарю за любые проницательные ответы.

EDIT:

Рассмотрим код (я удалил много строк, которые были проверкой для неожиданных возвращаемых значений для краткости) из обработчика onClick событий, который создает XMLHttpRequest и посылает его:

function submitme(){ 
    var p = document.getElementById('p'); //a text field being sent to server 
    if(typeof p!='undefined' && p!=null){ 
    if(p.value!=""){ 
     //here XMLHttpRequest is created, this function 
     //returns exactly object of this type or false, when failed 
     var xhr=createXmlHttpRequestObject(); 
     if(xhr!=false){ 
     xhr.open("POST", "blablabla.php", true); 
     xhr.onreadystatechange=function(){ 
      if(xhr.readyState==4){ 
      if(xhr.status==200){ 
       //result will be posted in this div below 
       var adiv = document.getElementById('resultdiv'); 
       //extract the XML retrieved from the server 
       xmlResponse = xhr.responseXML; 
       //obtain the document element (the root element) of the XML structure 
       xmlDocumentElement = xmlResponse.documentElement; 
       //get the response text 
       if(typeof adiv !='undefined' && adiv != null){ 
        adiv.innerHTML=xmlDocumentElement.childNodes[0].firstChild.nodeValue; 
       } 
      }//end xhr.status 
      }//end xhr.readyState 
     };//end xhr.onreadystatechange 
     xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
     xhr.send(p.value); 
     }//end xhr!=false 
    }//end p.value!="" 
    }//end typeof p!='undefined' 
}//end submitme() 

Когда Экземпляр объекта XMLHttpRequest создается, если этот обработчик запущен, он присваивается один раз переменной xhr, пока обработчик не завершит выполнение. На данный момент есть Сколько ссылок к этому объекту экземпляра? Если я правильно понимаю статьи, связанные с вашими ответами, ответ должен быть none, и браузер просто ждет этого запроса, чтобы он повернул readystate==4, завершить выполнение onreadystatechange функция и объект недоступен? Пожалуйста подтвердите.

ответ

2

У JavaScript есть встроенный сборщик мусора.

Вы можете прочитать статью this:

+0

Не могли бы вы посмотреть мой EDIT и подтвердить, правильно ли я понял? – Kitet

+0

Кажется правильным для меня. Единственная ошибка, которую я могу сказать, заключается в том, что в третьей строке отсутствует ')'. Вы также должны учитывать, что значение 'xhr.status', которое равно' 200 <= x <300' или 'x = 304', также имеет силу. Проверьте это: http://jsfiddle.net/57Pv7/ –

+0

Я принимаю этот ответ, потому что он пришел за 4 секунды до Quentin, хотя они одинаковы;) – Kitet

2

JavaScript имеет garbage collection, просто дайте ссылку на капли объекта XHR из области видимости, и она должна очищается автоматически.

0

XMLHttpRequest ничего особенного в том, что касается срока службы объекта.Как и любой другой объект, он будет собирать мусор, когда вы отбрасываете последнюю ссылку на него.

Возможно, необычная или незнакомая вещь с XMLHttpRequest - это срок службы, который требуется для обеспечения правильной работы запроса Ajax.

В принципе, вы должны иметь живой объект XMLHttpRequest в течение всего срока службы лежащего в основе запроса Ajax.

Как только запрос будет выполнен, вы можете удалить объект или повторно использовать его для другого запроса.
Этот сценарий часто используется людьми, которые не хотят беспокоиться об управлении памятью :).

Если вам нужно иметь сразу несколько запросов, вам понадобится более одного объекта XMLHttpRequest.
В этом случае вы, вероятно, захотите более точно управлять временем жизни каждого объекта XMLHttpRequest (либо возвращая его в пул бесплатных обработчиков запросов, либо удалив его).

2

http://xhr.spec.whatwg.org/#garbage-collection - вот ответ на ваш вопрос. Это является частью спецификации (как это должно быть реализовано, но это не 100% уверен, как это реализовано во всех браузерах), чтобы понять это более глубоко советую вам прочитать Дыра документ

объект

XMLHttpRequest не должен быть собран мусором, если его состояние ОТКРЫТО, а флаг send() установлен, его состояние HEADERS_RECEIVED или его состояние ЗАГРУЖАЕТСЯ, и имеет одно из следующих значений:

В нем зарегистрирован один или несколько прослушивателей событий чей тип - readystatechange, прогресс, прерывание, ошибка, загрузка, тайм-аут или loadend.

Флаг завершения загрузки не установлен, а связанный с ним объект XMLHttpRequestUpload имеет один или несколько зарегистрированных прослушивателей событий, тип которых - прогресс, прерывание, ошибка, загрузка, тайм-аут или загрузка.

Если объект XMLHttpRequest является сборкой мусора, когда его соединение все еще открыто, пользовательский агент должен завершить запрос.

2

Я недавно столкнулся с той же проблемой, и я нашел по всему Интернету, что у меня не должно быть никаких проблем, потому что это сбор мусора. Ну, вы ДОЛЖНЫ иметь проблемы, потому что довольно легко оставить некоторые ссылки, если вы только что заработали в первый раз.

Смотрите эту страницу:

http://javascript.info/tutorial/memory-leaks

и прокрутите вниз до "XmlHttpRequest ..."

Что он в основном говорит:

IF создать новый XHR (не использовать их повторно) И захватывать каждый объект xhr в закрытии re соответствующего обратного вызова onreadystatechange THEN объект xhr никогда не будет собираться с мусором, а утечка памяти увеличится.

Чтобы избежать этой ситуации, используйте этот для доступа к объекту xhr (например, для проверки состояния) и получить xhr из замыкания.

+0

+1 Я делал тонны нового XMLHttpRequest и попадал это. Вы также можете настроить 'onreadystatechange' на' null' для очистки – divillysausages

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