18.1.4. События, возникающие в ходе выполнения НТТР-запроса

We use cookies. Read the Privacy and Cookie Policy

В примерах выше для определения момента завершения HTTP-запроса использовалось событие «readystatechange». Проект спецификации «ХНН2» определяет более удобный набор событий, уже реализованный в Firefox, Chrome и Safari. В этой новой модели событий объект XMLHttpRequest генерирует различные типы событий на разных этапах выполнения запроса, благодаря чему отпадает необходимость проверять значение свойства readyState.

Далее описывается, как генерируются эти новые события в броузерах, поддерживающих их. Когда вызывается метод send(), один раз возбуждается событие «load-start». В ходе загрузки ответа сервера объект XMLHttpRequest возбуждает серию событий «progress», обычно каждые 50 миллисекунд или около того, которые можно использовать для обратной связи с пользователем, чтобы информировать его о ходе выполнения запроса. Если запрос завершается очень быстро, событие «progress» может и не возбуждаться. По завершении запроса возбуждается событие «load».

Завершение запроса не всегда означает успешное его выполнение, поэтому обработчик события «load» должен проверять код состояния в объекте XMLHttpRequest, чтобы убедиться, что был принят НТТР-код «200 ОК», а не «404 Not Found», например.

Существуют три разные ситуации, когда HTTP-запрос оканчивается неудачей, которым соответствуют три события. Если предельное время ожидания ответа истекло, генерируется событие «timeout». Если выполнение запроса было прервано, генерируется событие «abort». (О предельном времени ожидания и о методе abort() подробнее рассказывается в 18.1.5.) Наконец, выполнению запроса могут препятствовРть другие ошибки в сети, такие как слишком большое количество переадресаций, и в этих случаях генерируется событие «error».

Для каждого запроса броузер может возбуждать только по одному событию «load», «abort», «timeout» и «error». Проект спецификации «ХНН2» требует, чтобы броузеры возбуждали событие «loadend» после одного из этих событий. Однако на момент написания этих строк событие «loadend» не было реализовано ни в одном из броузеров.

Для регистрации обработчиков всех этих событий, возникающих в ходе выполнения запроса, можно использовать метод addEventListener() объекта XMLHttpRequest. Если каждое из этих событий обрабатывается единственным обработчиком, эти обработчики обычно проще установить, присвоив их соответствующим свойствам объекта, таким как onprogress и onload. Определяя наличие этих свойств, можно даже проверить поддержку соответствующих событий в броузере:

if ("onprogress" in (new XMLHttpRequest())) {

  // События, возникающие в ходе выполнения запроса, поддерживаются

}

Объект события, связанный с этими событиями, возникающими в ходе выполнения запроса, в дополнение к свойствам обычного объекта Event, таким как type и timestamp, добавляет три полезных свойства. Свойство loaded определяет количество байтов, переданных к моменту возбуждения события. Свойство total содержит общий объем (в байтах) загружаемых данных, определяемый из заголовка «Content-Length», или 0, если объем содержимого не известен. Наконец, свойство lengthComputable содержит значение true, если общий объем содержимого известен, и false - в противном случае. Очевидно, что свойства total и loaded особенно полезны в обработчиках событий, возникающих в ходе выполнения запроса:

request.onprogress = function(e) {

  if (e.lengthComputable)

    progress.innerHTML = Math.round(100*e.loaded/e.total) + ”% Выполнено";

}