2010-07-02 7 views
8

Parece que el éxito, el error y las devoluciones de llamada completas solo se activan cuando la solicitud de ajax puede obtener alguna respuesta del servidor.Comprobar el estado de una solicitud jQuery ajax

Así que si apago el servidor, la siguiente devolución de llamada de error no se ejecuta y la solicitud falla silenciosamente.

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error"); 
    } 
}); 

¿Cuál es la mejor manera de lanzar un error cuando el servidor no puede ser alcanzado en absoluto.

Edición - Por lo que he intentado y leído, parece que el manejo de errores incorporado de jQuery no funciona con JSONP, o dataType: "script". Así que voy a intentar configurar un tiempo de espera manual.

Editar - Hice un poco más de investigación y parece que no solo no funciona la devolución de llamada de error ajax, pero no se puede abortar una solicitud ajax con script dataType o jsonp, y esas solicitudes ignoran la configuración de tiempo de espera.

Existe una alternativa: el complemento jquery-jsonp, pero usa iframes ocultos que prefiero evitar. Así que me he decidido a crear un tiempo de espera manual como se sugiere a continuación. No puede cancelar la solicitud si se agota el tiempo de espera, lo que significa que la secuencia de comandos aún se puede cargar incluso después del tiempo de espera, pero al menos algo se activará si el servidor no está disponible.

+0

Jquery de ajax tiene incorporado el manejo de errores (ver mi respuesta a continuación) puede usar ajaxsetup para aplicar estas opciones. – Sphvn

Respuesta

7

Puede usar un setTimeout y borrarlo con clearTimeout en el controlador completo.

var reqTimeout = setTimeout(function() 
{ 
    alert("Request timed out."); 
}, 5000); 
var xhr = $.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
    alert("success"); 
    }, 
    error: function() { 
    alert("error");   
    }, 
    complete: function() { 
    clearTimeout(reqTimeout); 
    } 
}); 
+0

Parece que esta es la única solución. Funcionando bien hasta ahora, excepto por el xhr.abort(). Firebug da un error que xhr no está definido. –

0

Si no recuerdo mal, jQuery arroja excepciones. Por lo tanto, debería poder trabajar con un try { ... } catch() { ... } y manejarlo allí.

5

jQuery.ajax ya tiene una preferencia timeout y debe llamar a su manejador de errores si la solicitud expira. Salida the fantastic documentation que dice - Me cito aquí, el énfasis es mío:

timeoutNumber

Establecer un tiempo muerto local (en milisegundos) para la solicitud ...

y:

error (XMLHttpRequest, textStatus, errorThrown) Function

Una función ser llamado si la solicitud falla. La función recibe tres argumentos: el objeto XMLHttpRequest, una cadena que describe el tipo de error que ocurrió y un objeto de excepción opcional, si se produjo. Los valores posibles para el segundo argumento (además de nulo) son "timeout", "error", "notmodified" y "parsererror". Este es un Evento Ajax.

+0

desafortunadamente ni el tiempo de espera ni el error funcionan para dataType: Jsonp o script. –

+0

Estoy usando JSONP y funciona ^^ pero lo que sea que flote su bote. – Sphvn

+2

Para JSON-P prueba un proyecto llamado 'jquery-jsonp'. –

0

Puede usar Jquery's AjaxSetup para manejar su error.

$.ajax({ 
    type: "GET", 
    url: "http://localhost:3000/", 
    dataType: "script", 
    success: function() { 
     alert("success"); 
    }, error: function() { 
     alert("error"); 
    } 
    //AJAX SETUP "error"// 
    $.ajaxSetup({ 
     "error": function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(XMLHttpRequest + ' ' + textStatus + ' ' + errorThrown); //however you want 
     } 
    }); 
0

en IE8, puede utilizar:

success: function(data, textStatus, XMLHttpRequest) { 
    if("success"==textStatus&&XMLHttpRequest){ 
     alert("success"); 
    }else{ 
     alert("server down"); 
    } 
    } 

pero está no puede funcionar en Chrome, Firefox ... Traté

1
error: function (jqXHR, textStatus, errorthrown) { 
    if (jqXHR.readyState == 0) { 
     //Network error, i.e. server stopped, timeout, connection refused, CORS, etc. 
    } 
    else if (jqXHR.readyState == 4) { 
     //HTTP error, i.e. 404 Not found, Internal Server 500, etc. 
    } 
} 

Uso readyState de XMLHttpRequest para determinar el estado de la petición Ajax. 'readyState' tiene el estado de XMLHttpRequest.

  • 0: no solicitar inicializan
  • 1: conexión de servidor establecido
  • 2: solicitud recibida
  • 3: Solicitud de procesamiento de
  • 4: Solicitud de acabado y la respuesta está listo
Cuestiones relacionadas