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

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

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

Оглавление книги


Генерация: 1.960. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз