5 votes

jquery - pourquoi $.ajax appelle-t-il le gestionnaire de succès alors que la requête est interrompue parce que mon serveur est hors service ?

Lorsque j'arrête mon serveur et que j'y effectue une requête ajax, firebug montre que la requête est interrompue quelques secondes après avoir été effectuée, et mon fichier success est appelé.

Pourquoi le gestionnaire de succès est-il appelé, alors que ce ne devrait pas être le gestionnaire d'erreur ? Et comment puis-je détecter de manière fiable que ce n'était pas vraiment un succès ?

CODE :

            $.ajax({
                url: url,
                type: "POST",
                data: data,
                dataType: "json",
                success:function(data, statusText, xhr){
                  //gets called on success, or even when server is down.
                },
                error: function(){
                  //called if server returns error, but not if it doesn't respond
                }
            });

MISE À JOUR : Ce comportement est uniquement sur localhost, il se produit lorsque je désactive mon serveur de développement. J'ai testé pour voir ce qui se passe lorsque j'essaie d'atteindre le serveur de production, mais que mon internet personnel est désactivé, et il se bloque simplement, sans appeler de succès ou d'erreur du tout. Je suppose que je devrais définir la propriété timeout pour ce cas.

3voto

Matias Points 2435

Je pense que c'est un bug ( ?) dans la version 1.4.2 de jQuery.

Je cite un commentaire du Documentation sur jQuery :

En 1.4.2, jquery n'appelle pas ajax sur une erreur de timeout/connexion. pour corriger cela : supprimez l'option trailing " || xhr.status === 0" de la fonction fonction httpSuccess

Faites-le si vous voulez modifier le code jQuery lui-même. Sinon, vous pouvez le vérifier dans votre callback de succès comme je le fais ici :

$.ajax({
   type: "POST",
   url: "http://madeUpServerthatdoesnotExist.com/index.php",
   data: "id=1",
   success: function(msg){
     if(this.xhr().status === 0 ){
           errorHandler();
     }
     else {
           alert('Success');
     }
   },
    error: errorHandler
 });

function errorHandler(){
            alert('Freakin error');
}

Il semble que ce soit difficile, veuillez commenter si vous connaissez un meilleur moyen !

EDITAR: Après avoir fait des recherches, je ne suis pas sûr que cela puisse être un bug dans jQuery, je mettrai à jour la réponse dès que j'aurai un indice.

2voto

Josh Rosen Points 2540

Il semble que ce bogue ait été corrigé dans la version 1.4.3 de jQuery :

http://bugs.jquery.com/ticket/6060

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