¿Cómo atrapo un error de la publicación de consulta Ajax?

Me gustaría detectar el error y mostrar el mensaje apropiado si falla la solicitud de Ajax.

Mi código es como el siguiente, pero no pude conseguir la solicitud Ajax que falló.

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 falla la solicitud de Ajax.

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

Desde jQuery 1.5 puede usar el mecanismo de objetos diferidos:

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

Otra forma es usar .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"); } }); 

jQuery 1.5 agregó objetos diferidos que manejan esto muy bien. Simplemente llame a $.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 done se llamaba success y el fail se llamaba error .

 $.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); } }); 
 $.post('someUri', { }, function(data){ doSomeStuff }) .fail(function(error) { alert(error.responseJSON) }); 

Una forma simple es implementar ajaxError :

Cuando una solicitud de Ajax se completa con un error, jQuery desencadena el evento ajaxError. Todos y cada uno de los controladores que se han registrado con el método .ajaxError () se ejecutan en este momento.

Por ejemplo:

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

Sugeriría leer la documentación de ajaxError . Hace más que el simple caso de uso demostrado anteriormente, principalmente su callback acepta una serie de parámetros:

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

Solucioné este problema declarando datatype: 'json' en mi llamada jQuery ajax.