Как определить тайм-аут в вызове AJAX (XmlHttpRequest) в браузере?

Я смотрю в Интернете, но документация трудно найти. Мы все знаем базовый вызов AJAX с использованием встроенного в XMLHttpRequest объекта браузера (предположим, что здесь используется современный браузер):

    var xmlHttp = new XMLHttpRequest();  // Assumes native object

    xmlHttp.open("GET", "http://www.example.com", false);

    xmlHttp.send("");

    var statusCode = xmlHttp.status;
    // Process it, and I'd love to know if the request timed out

Итак, есть ли способ обнаружить, что вызов AJAX был завершен, проверяя объект XMLHttpRequest в браузере? Будет ли мне рекомендовано сделать что-то вроде window.setTimeout(function() {xmlHttp.abort()}, 30000);?

Спасибо!

-Mike

Ответ 1

ОБНОВЛЕНИЕ: Здесь пример того, как вы можете обрабатывать таймаут:

var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", "http://www.example.com", true);

xmlHttp.onreadystatechange=function(){
   if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
      clearTimeout(xmlHttpTimeout); 
      alert(xmlHttp.responseText);
   }
}
// Now that we're ready to handle the response, we can make the request
xmlHttp.send("");
// Timeout to abort in 5 seconds
var xmlHttpTimeout=setTimeout(ajaxTimeout,5000);
function ajaxTimeout(){
   xmlHttp.abort();
   alert("Request timed out");
}

В IE8 вы можете добавить timeout обработчик событий XMLHttpRequest.

var xmlHttp = new XMLHttpRequest();
xmlHttp.ontimeout = function(){
  alert("request timed out");
}

Я бы рекомендовал не делать синхронные вызовы, как ваш код, а также рекомендовать использовать фреймворк javascript для этого. jQuery - самый популярный. Это делает ваш код более эффективным, простым в обслуживании и совместимым с кросс-браузером.

Ответ 2

Некоторые из современных браузеров (2012) делают это без необходимости полагаться на setTimeout: он включен в XMLHttpRequest. См. Ответ fooobar.com/info/78172/...:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
        alert("ready state = 4");
    }
};

xhr.open("POST", "http://www.service.org/myService.svc/Method", true);
xhr.setRequestHeader("Content-type", "application/json; charset=utf-8");
xhr.timeout = 4000;
xhr.ontimeout = function () { alert("Timed out!!!"); }
xhr.send(json);