2009-06-19 3 views
40

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

ответ

48

UPDATE: Вот an example того, как вы можете справиться с тайм-аут:

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 объекта.

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

47

Некоторые из современных браузеров (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); 
+9

В 2014 году этот ответ должен быть помечен как правильный. В настоящее время почти любой браузер поддерживает это (даже IE8 и далее). –

+3

Ну, не совсем - будьте предупреждены о том, что событие ontimeout не запускается до тех пор, пока не будет запущена функция готовности к запуску == 4. Это не только неинтуитивно, но и затрудняет создание условного поведения, основанное на том, что загрузка не удалась из-за того, что был тайм-аут или нет. Например, настройка оповещения пользователя о причине неудачной загрузки. В моей ситуации я обнаружил, что могу сделать только то, что хотел с помощью setTimeout. Кроме того, xhr.timeout, похоже, не работает в Safari с 2016 года. – Allasso

Смежные вопросы