2010-05-14 69 views
144

Me gustaría detectar el error y mostrar el mensaje apropiado si la solicitud Ajax falla.¿Cómo puedo detectar un error en una consulta de Ajax?

Mi código es como el siguiente, pero no logré captar la solicitud Ajax defectuosa.

function getAjaxData(id) 
{ 
    $.post("status.ajax.php", {deviceId : id}, function(data){ 

     var tab1; 

     if (data.length>0) { 
      tab1 = data; 
     } 
     else { 
      tab1 = "Error in Ajax"; 
     } 

     return tab1; 
    }); 
} 

Descubrí que "Error en Ajax" nunca se ejecuta cuando la solicitud Ajax falla.

¿Cómo manejo el error Ajax y muestro el mensaje apropiado si falla?

Respuesta

175

Desde jQuery 1.5 se puede utilizar el mecanismo de objetos diferido:

$.post('some.php', {name: 'John'}) 
    .done(function(msg){ }) 
    .fail(function(xhr, status, error) { 
     // error handling 
    }); 

Otra forma es utilizar .ajax:

$.ajax({ 
    type: "POST", 
    url: "some.php", 
    data: "name=John&location=Boston", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    alert("some error"); 
    } 
}); 
+14

@Yuck $ .post puede aceptar una devolución de llamada de error utilizando objetos diferidos. Echa un vistazo a mi respuesta a continuación para ver un ejemplo. –

+2

Además, la forma de hacer '$ .ajax' más legible es usar un hash para tus' datos'. Por ejemplo: '{nombre: 'John', ubicación: 'Boston'}' – briangonzalez

+3

Las devoluciones de llamadas de éxito y error anteriores están obsoletas a partir de jQuery 1.8 http://api.jquery.com/jQuery.post/ – Baldy

78
$.ajax({ 
    type: 'POST', 
    url: 'status.ajax.php', 
    data: { 
    deviceId: id 
    }, 
    success: function(data){ 
    // your code from above 
    }, 
    error: function(xhr, textStatus, error){ 
     console.log(xhr.statusText); 
     console.log(textStatus); 
     console.log(error); 
    } 
}); 
10

Una forma sencilla es poner en práctica ajaxError:

Siempre que n La solicitud Ajax completa con un error, jQuery activa el evento ajaxError . Todos y cada uno de los controladores que se han registrado con el método .ajaxError() se ejecutan en esta vez.

Por ejemplo:

$('.log').ajaxError(function() { 
    $(this).text('Triggered ajaxError handler.'); 
}); 

que sugeriría leer la documentación ajaxError. Hace más que el simple uso de los casos se demostró anteriormente - sobre todo su devolución de llamada acepta un número de parámetros:

$('.log').ajaxError(function(e, xhr, settings, exception) { 
    if (settings.url == 'ajax/missing.html') { 
    $(this).text('Triggered ajaxError handler.'); 
    } 
}); 
+1

+1 - Añadiría que este controlador obtiene varios argumentos, por lo que puede mostrar el error real, el código de respuesta, la url, etc. –

+0

@Nick - agregó que en. – karim79

+0

Excelente ... ¡pero no puede obtener un +2 de mí! :) –

244

jQuery 1,5 añadió objetos diferidos que manejan esta muy bien. Simplemente llame al $.post y adjunte los controladores que desee después de la llamada. Los objetos diferidos incluso le permiten asociar múltiples manejadores de errores y de éxito.

Ejemplo:

$.post('status.ajax.php', {deviceId: id}) 
    .done(function(msg) { ... }) 
    .fail(function(xhr, textStatus, errorThrown) { 
     alert(xhr.responseText); 
    }); 

Antes de jQuery 1.8, la función de done se llamó success y fail fue llamado error.

+3

+1 Muy bonito, pero aún no está loco por la sintaxis. Con suerte, se unificará en una versión futura. – Yuck

+19

Esta debería ser la respuesta aceptada. La respuesta aceptada actual es "utilizar un método diferente"; esta respuesta dice "así es cómo hacer que tu método funcione". Este último generalmente se prefiere en SO. ¡En realidad, esto debería incluirse en la documentación de $ .post! –

+2

http://api.jquery.com/deferred.fail, http://api.jquery.com/deferred.done para documentación – Deleplace

12
$.post('someUri', { }, 
    function(data){ doSomeStuff }) 
.fail(function(error) { alert(error.responseJSON) }); 
+2

Agregando un poco más de explicación aquí ayudaría a los futuros lectores. –

+0

¿Qué pasa si tengo un error indefinido? – Muflix

1

He resuelto este problema al declarar datatype: 'json' en mi llamada jQuery ajax.

Cuestiones relacionadas