18.1.2.1. Получение синхронного ответа

We use cookies. Read the Privacy and Cookie Policy

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