Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

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 вы познакомитесь с одним из случаев, когда синхронные запросы вполне допустимы.

18.1.2.2. Декодирование ответа

В примерах выше предполагалось, что сервер возвращает ответ в виде простого текста, с MIME-типом «text/ріаіп», «text/html» или «text/css», и мы извлекаем его из свойства

responseText
объекта
XMLHttpRequest
.

Однако существуют и другие способы обработки ответов сервера. Если сервер посылает в ответе XML- или XHTML-документ, разобранное представление XML-документа можно получить из свойства

responseXML
. Значением этого свойства является объект
Document
, при работе с которым можно использовать приемы, представленные в главе 15. (Проект спецификации «XHR2» требует, чтобы броузеры автоматически выполняли синтаксический анализ ответов типа «text/html» и также делали их доступными через свойство
responseXML
в виде объектов Document, но на момент написания этих строк это требование не было реализовано в текущих броузерах.)

Если в ответ на запрос серверу потребуется отправить структурированные данные, такие как объект или массив, он может передать данные в виде строки в формате JSON (раздел 6.9). После получения такой строки содержимое свойства

responseText
можно передать методу
JSON.parse.
Пример 18.3 является обобщенной версией примера 18.2: он выполняет запрос методом GET по указанному URL-ад-ресу и после получения содержимого этого адреса передает его указанной функции обратного вызова. Но теперь функции не всегда будет передаваться простой текст - ей может быть передан объект
Document
, объект, полученный с помощью
JSON.parse,
или строка.

  • Читать дальше
  • 1
  • ...
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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