web-dev-qa-db-fra.com

Comment puis-je intercepter une erreur de requête Ajax?

Je voudrais attraper l'erreur et montrer le message approprié si la demande Ajax échoue.

Mon code est comme le suivant, mais je ne pouvais pas attraper la requête Ajax qui échouait.

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

J'ai découvert que "Erreur dans Ajax" n'est jamais exécuté lorsque la demande Ajax a échoué.

Comment gérer l'erreur Ajax et afficher le message approprié en cas d'échec?

199
TTCG

Depuis jQuery 1.5, vous pouvez utiliser le mécanisme des objets différés:

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

Une autre façon consiste à utiliser .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");
  }
});
279
choise

jQuery 1.5 a ajouté des objets différés qui gèrent cela bien. Appelez simplement $.post et attachez tous les gestionnaires que vous souhaitez après l'appel. Les objets différés vous permettent même d’attacher plusieurs gestionnaires de succès et d’erreur.

Exemple:

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

Avant jQuery 1.8, la fonction done était appelée success et fail était appelée error.

279
Michael Venable
$.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);
  }
});
88
jAndy
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });
14
marknery

Un moyen simple consiste à implémenter ajaxError :

Chaque fois qu'une demande Ajax se termine avec une erreur, jQuery déclenche l'événement ajaxError. Tous les gestionnaires enregistrés avec la méthode .ajaxError () sont exécutés à ce moment.

Par exemple:

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

Je suggère de lire la documentation ajaxError . Il fait plus que le simple cas d'utilisation présenté ci-dessus - son rappel accepte principalement un certain nombre de paramètres:

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