Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

Теоретически событие «readystatechange» генерируется всякий раз, когда изменяется значение свойства

readyState
. На практике же событие может не возбуждаться, когда свойство
readyState
получает значение 0 или 1. Оно часто возбуждается при вызове метода
send,
даже при том, что свойство
readyState
по-прежнему содержит значение
OPENED
. Некоторые броузеры возбуждают событие множество раз для состояния
LOADING
, чтобы обеспечить обратную связь. Все броузеры возбуждают событие «readystatechange», когда завершается прием ответа сервера и свойство
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 вы познакомитесь с одним из случаев, когда синхронные запросы вполне допустимы.

Поделиться:
Популярные книги

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

#Бояръ-Аниме. Газлайтер. Том 24

Володин Григорий Григорьевич
24. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 24

Прапорщик. Назад в СССР. Книга 7

Гаусс Максим
7. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 7

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Бастард Императора. Том 12

Орлов Андрей Юрьевич
12. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 12

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила