2009-06-19 19 views
40

Estoy buscando en la web, pero la documentación es difícil de encontrar. Todos sabemos que la llamada AJAX básica usando el navegador integrado en XMLHttpRequest objeto (asumir un navegador moderno aquí):¿Cómo detectar el tiempo de espera en una llamada AJAX (XmlHttpRequest) en el navegador?

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 

Por lo tanto, hay una manera que puedo detectar que la llamada AJAX Tiempo de espera agotado mediante la inspección del XMLHttpRequest objeto en el navegador? ¿Se me aconsejaría hacer algo como window.setTimeout(function() { xmlHttp.abort() }, 30000);?

Gracias!

-Mike

Respuesta

48

ACTUALIZACIÓN: Aquí es an example de cómo se puede manejar un tiempo de espera:

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"); 
} 

En IE8, puede agregar un controlador timeout de eventos al objeto XMLHttpRequest.

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

recomendaría en contra de hacer llamadas síncronas por ejemplo el código implica y también recomendamos el uso de un marco javascript para hacer esto. jQuery es el más popular. Hace que su código sea más eficiente, más fácil de mantener y compatible con varios navegadores.

47

Algunos de los navegadores modernos (2012) lo hacen sin tener que depender de setTimeout: está incluido en XMLHttpRequest. Ver respuesta 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

En 2014, esta respuesta debe etiquetarse como la correcta. Hoy en día, casi cualquier navegador admite esto (incluso IE8 en adelante). –

+3

Bueno, no del todo: tenga en cuenta que el evento ontimeout no se activará hasta DESPUÉS de que readyState == 4 se active. Esto no solo no es intuitivo, sino que dificulta la creación de un comportamiento condicional en función de si una carga no tuvo éxito debido al hecho de que hubo un tiempo de espera o no. Por ejemplo, personalizando una alerta de usuario sobre el motivo por el que falló una carga. En mi situación, descubrí que solo podía lograr lo que quería con setTimeout. Además, xhr.timeout no parece funcionar en Safari a partir de 2016. – Allasso

Cuestiones relacionadas