JavaScript. Подробное руководство, 6-е издание
Шрифт:
Теоретически событие «readystatechange» генерируется всякий раз, когда изменяется значение свойства
readyState
. На практике же событие может не возбуждаться, когда свойство readyState
получает значение 0 или 1. Оно часто возбуждается при вызове метода send,
даже при том, что свойство readyState
по-прежнему содержит значение OPENED
. Некоторые броузеры возбуждают событие множество раз для состояния LOADING
, чтобы обеспечить
readyState
получает значение 4. Так как это событие может возбуждаться еще до завершения приема ответа, обработчики события «readystatechange» всегда должны проверять значение свойства readyState
. Чтобы обрабатывать события «readystatechange», нужно присвоить функцию обработчика события свойству
onreadystatechange
объекта XMLHttpRequest
. Можно также воспользоваться методом addEventListener
(или attachEvent
в IE версии 8 и ниже), но обычно для обработки запроса бывает вполне достаточно одного обработчика, поэтому проще установить свойство onreadystatechange
.
Пример 18.2 определяет функцию
getText,
которая демонстрирует особенности обработки событий «ready statechange». Обработчик события сначала проверяет завершение запроса. После этого он проверяет код состояния ответа и убеждается в успешном выполнении. Затем он извлекает заголовок «Content-Type», чтобы убедиться, что получен ответ ожидаемого типа. Если выполняются все три условия, он передает тело ответа (в виде текста) указанной функции обратного вызова. Пример 18.2. Получение HTTP-ответа в обработчике onreadystatechange
// Выполняет запрос HTTP GET содержимого указанного URL-адреса.
// После успешного получения ответа проверяет, содержит ли он простой текст,
// и передает его указанной функции обратного вызова
function getText(url, callback) {
var request = new XMLHttpRequest; // Создать новый запрос
request.open("GET", url); // Указать URL-адрес ресурса
request.onreadystatechange = function {
// Определить обработчик события
// Если запрос был выполнен успешно
if (request.readyState === 4 && request.status === 200) {
var type = request.getResponseHeader("Content-Type");
if (type.fnatch(/~text/)) // Убедиться, что это текст
callback(request.responseText); //
Передать функции
}
};
request.send(null); // Отправить запрос
}
18.1.2.1. Получение синхронного ответа
Сама природа HTTP-ответа предполагает их асинхронную обработку. Тем не менее объект
XMLHttpRequest
поддерживает возможность получения ответов в синхронном режиме. Если в третьем аргументе передать методу open
значение false, выполнение метода send
будет заблокировано до завершения запроса. В этом случае отпадает необходимость использовать обработчик события: после того как метод send
вернет управление, можно будет сразу же проверить свойства status
и responseText
объекта XMLHttpRequest
. Сравните следующую синхронную реализацию функции getText
из примера 18.2:
// Выполняет синхронный запрос HTTP GET содержимого по указанному URL-адресу.
// Возвращает текст ответа. Возбуждает исключение в случае неудачи
// или если ответ не является текстом,
function getTextSync(url) {
var request = new XMLHttpRequest; // Создать новый запрос
request.open( "GET", url, false); // false - синхронный режим
request.send(null); // Отправить запрос
// Возбудить исключение, если код состояния не равен 200
if (request.status !== 200) throw new Error(request.statusText);
// Возбудить исключение, если ответ имеет недопустимый тип
var type = request.getResponseHeader("Content-Type");
if (!type.match(/~text/))
throw new Error("Ожидался текстовый ответ; получен: " + type);
return request.responseText;
}
Синхронные запросы выглядят весьма заманчиво, однако использовать их нежелательно. Интерпретатор JavaScript на стороне клиента выполняется в единственном потоке, и когда метод
send
блокируется, это обычно приводит к зависанию пользовательского интерфейса всего броузера. Если сервер, к которому выполнено подключение, отвечает на вопросы с задержкой, броузер пользователя будет зависать. Тем не менее в разделе 22.4 вы познакомитесь с одним из случаев, когда синхронные запросы вполне допустимы.
Поделиться:
Популярные книги
Геном хищника. Книга третья
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Афганский рубеж
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Хозяин Теней 3
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адепт. Том второй. Каникулы
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Шайтан Иван
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Черный Маг Императора 23
23. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 5
5. Двойник Короля
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Беглец
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Инженер Петра Великого 4
4. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вечный. Книга I
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
На цепи
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Последний Герой. Том 4
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
На границе империй. Том 10. Часть 5
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Двойник короля 16
16. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00