Как определить время ожидания вызова AJAX (XmlHttpRequest) в браузере? - PullRequest
42 голосов
/ 19 июня 2009

Я смотрю в Интернете, но трудно найти документацию. Все мы знаем базовый вызов 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

Ответы [ 2 ]

52 голосов
/ 01 июля 2013

Некоторые современные браузеры (2012) делают это, не полагаясь на setTimeout: он включен в XMLHttpRequest. Смотрите ответ https://stackoverflow.com/a/4958782/698168:

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);
51 голосов
/ 19 июня 2009

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

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 является самым популярным. Это делает ваш код более эффективным, простым в обслуживании и совместимым с различными браузерами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...