2009-06-19 15 views
40

Sto cercando sul web, ma la documentazione è difficile da trovare. Sappiamo tutti che la chiamata AJAX base utilizzando il browser integrato nel XMLHttpRequest oggetto (assumere un browser moderno qui):Come rilevare il timeout su una chiamata AJAX (XmlHttpRequest) nel browser?

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 

Quindi, c'è un modo che posso rilevare che la chiamata AJAX scaduta ispezionando il XMLHttpRequest oggetto nel browser? Dovrei essere avvisato di fare qualcosa come window.setTimeout(function() { xmlHttp.abort() }, 30000);?

Grazie!

-Mike

risposta

48

UPDATE: Ecco an example di come è possibile gestire un timeout:

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

in IE8, è possibile aggiungere un gestore di eventi timeout all'oggetto XMLHttpRequest.

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

lo consiglio contro le chiamate sincrone come suggerisce il codice e consiglia anche di utilizzare un framework javascript per fare questo. jQuery è il più popolare. Rende il tuo codice più efficiente, più facile da mantenere e compatibile con browser.

47

Alcuni dei browser moderni (2012) lo fanno senza dover fare affidamento su setTimeout: è incluso in XMLHttpRequest. V. risposta 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

Nel 2014, questa risposta da codificare come quella corretta. Al giorno d'oggi, quasi tutti i browser supportano questo (anche IE8 in poi). –

+3

Beh, non proprio, sii avvisato che l'evento ontimeout non viene attivato fino a quando non viene attivato readyState == 4. Questo non solo non è intuitivo, ma rende difficile creare un comportamento condizionale in base al fatto che un caricamento non abbia avuto esito positivo a causa del fatto che esistesse un timeout o meno. Ad esempio, personalizzare un avviso utente sul motivo per cui un caricamento non è riuscito. Nella mia situazione ho scoperto che potevo realizzare solo ciò che volevo con setTimeout. Inoltre, xhr.timeout non sembra funzionare su Safari a partire dal 2016. – Allasso

Problemi correlati