228 votes

Comment corriger une erreur de post de requête Ajax ?

J'aimerais détecter l'erreur et afficher le message approprié si la requête Ajax échoue.

Mon code est le suivant, mais je n'ai pas réussi à rattraper la requête Ajax qui échoue.

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 le message "Error in Ajax" n'est jamais exécuté lorsque la requête Ajax a échoué.

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

337voto

choise Points 5720

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

15 votes

@Yuck $.post peut accepter un rappel d'erreur en utilisant des objets différés. Jetez un coup d'œil à ma réponse ci-dessous pour un exemple.

2 votes

De plus, je peux faire $.ajax plus lisible est d'utiliser un hachage pour votre data . Par exemple : { name : 'John', location: 'Boston' }

3 votes

Les rappels de succès et d'erreur ci-dessus sont obsolètes depuis la version 1.8 de jQuery. api.jquery.com/jQuery.post

301voto

Michael Venable Points 1829

La version 1.5 de jQuery a ajouté des objets différés qui gèrent bien cette situation. Il suffit d'appeler $.post et attachez 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'erreurs.

Exemple :

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

Avant la version 1.8 de jQuery, la fonction done s'appelait success y fail s'appelait error .

3 votes

+1 Très beau, mais toujours pas emballé par la syntaxe. Espérons qu'elle sera unifiée dans une prochaine version.

27 votes

Cela devrait être la réponse acceptée. La réponse actuellement acceptée est "utilisez une autre méthode" ; cette réponse dit "voici comment faire fonctionner votre méthode". Cette dernière est généralement préférée sur SO. En fait, cela devrait être inclus dans la documentation $.post !!!

2 votes

97voto

jAndy Points 93076
$.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);
  }
});

18voto

marknery Points 402
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });

5 votes

L'ajout d'un peu plus d'explications ici aiderait les futurs lecteurs.

14voto

karim79 Points 178055

Une solution simple consiste à mettre en œuvre ajaxError :

Chaque fois qu'une requête Ajax avec une erreur, jQuery déclenche la fonction ajaxError. Tous les gestionnaires qui ont été enregistrés avec la méthode .ajaxError() sont exécutés à ce moment-là. à ce moment-là.

Par exemple :

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

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

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

1 votes

+1 - J'ajouterais que ce gestionnaire reçoit plusieurs arguments, de sorte que vous pouvez afficher l'erreur réelle, le code de réponse, l'url, etc.

0 votes

Notez que depuis jQuery 1.8, la méthode .ajaxError() ne doit être attachée qu'à un document.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X