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

18.1.5. Прерывание запросов и предельное время ожидания

18.1.5. Прерывание запросов и предельное время ожидания

Выполнение HTTP-запроса можно прерывать вызовом метода abort() объекта XMLHttpRequest. Метод abort() доступен во всех версиях объекта XMLHttpRequest, и согласно спецификации «XHR2» вызов метода abort() генерирует событие «abort». (На момент написания этих строк некоторые броузеры уже поддерживали событие «abort». Наличие этой поддержки можно определить по присутствию свойства onabort в объекте XMLHttpRequest.)

Основная причина для вызова метода abort() - появление необходимости отменить запрос, превышение предельного времени ожидания или если ответ становится ненужным. Допустим, что объект XMLHttpRequest используется для запроса подсказки в механизме автодополнения для текстового поля ввода. Если пользователь успеет ввести в поле новый символ еще до того, как подсказка будет получена с сервера, надобность в этой подсказке отпадает и запрос можно прервать.

Спецификация «XHR2» определяет свойство timeout, в котором указывается промежуток времени в миллисекундах, после которого запрос автоматически будет прерван, а также определяет событие «timeout», которое должно генерироваться (вместо события «abort») по истечении установленного промежутка времени. На момент написания этих строк броузеры еще не поддерживали автоматическое прерывание запроса по истечении предельного времени ожидания (и объекты XMLHttpRequest в них не имели свойств timeout и ontimeout). Однако имеется возможность реализовать собственную поддержку прерывания запросов по истечении заданного интервала времени с помощью функции setTimeout() (раздел 14.1) и метода abort(). Как это сделать, демонстрирует пример 18.12.

Пример 18.12. Реализация поддержки предельного времени ожидания

// Выполняет запрос HTTP GET на получение содержимого указанного URL.
// В случае благополучного получения ответа передает содержимое responseText функции
// обратного вызова. Если ответ не пришел в течение указанного времени, выполнение
// запроса прерывается. Броузеры могут возбуждать событие "readystatechange" после
// вызова abort(), а в случае получения части ответа свойство status может даже
// свидетельствовать об успехе, поэтому необходимо установить флаг, чтобы избежать
// вызова функции в случае получения части ответа при прерывании запроса по превышению
// времени ожидания. Эта проблема не наблюдается при использовании события load,
function timedGetText(url, timeout, callback) {
  var request = new XMLHttpRequest(); // Создать новый запрос,
  var timedout = false; // Истекло ли время ожидания.
  // Запустить таймер, который прервет запрос по истечении
  // времени, заданного в миллесекундах.
  var timer = setTimeout(function() { // Запустить таймер. Если сработает,
      timedout = true; // установить флаг
      request.abort(); // и прервать запрос.
  };
  timeout); // Интервал времени ожидания
  request.open( "GET", url); // Указать URL запроса
  request.onreadystatechange = function() { // Обработчик события.
    if (request.readyState !== 4) return; // Игнорировать незаконч. запрос
    if (timedout) return; // Игнорировать прерв. запрос
    clearTimeout(timer); // Остановить таймер,
    if (request.status === 200) // В случае успеха
      callback(request.responseText); // передать ответ функции.
  };
  request.send(null); // Отправить запрос
}

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


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