Как определить время ожидания вызова 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);
?
Спасибо!
-Майк
2 ответа
ОБНОВЛЕНИЕ: Вот пример того, как вы можете справиться с таймаутом:
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 Вы можете добавить обработчик события тайм-аута к XMLHttpRequest
объект.
var xmlHttp = new XMLHttpRequest();
xmlHttp.ontimeout = function(){
alert("request timed out");
}
Я бы рекомендовал не делать синхронные вызовы, как подразумевает ваш код, а также рекомендую использовать для этого среду javascript. JQuery является самым популярным. Это делает ваш код более эффективным, простым в обслуживании и совместимым с различными браузерами.
Некоторые из современных браузеров (2012) делают это, не полагаясь на setTimeout
: он включен в XMLHttpRequest. Смотрите ответ /questions/45181961/tajm-aut-xmlhttprequest/45181969#45181969:
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);