96 votes

Y a-t-il une analogie avec un "finally" dans les appels AJAX de jQuery ?

Existe-t-il un équivalent du "finally" de Java dans les appels AJAX de jQuery ? J'ai ce code ici. Dans mon toujours Je lève une exception, mais je veux TOUJOURS qu'elle soit envoyée à l'adresse suivante then() méthode.

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

J'ai essayé d'utiliser terminé() , terminer() et l'autre toujours() mais rien ne semble fonctionner.

Voici JSFiddle :

http://jsfiddle.net/qv3t3L0m/

157voto

Voir cet exemple :

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

Pour plus d'informations : http://api.jquery.com/jquery.ajax/

46voto

jrummell Points 23718

.always() devrait fonctionner. Voir le L'objet jqXHR section à http://api.jquery.com/jQuery.ajax/ .

jqXHR.always(function(data|jqXHR, textStatus, jqXHR|errorThrown) { }) ; Une construction alternative à l'option de callback complète, la méthode .always() remplace la méthode dépréciée .complete().

En réponse à une requête réussie, les arguments de la fonction sont les éléments suivants mêmes que ceux de .done() : data, textStatus et l'objet jqXHR. Pour demandes échouées, les arguments sont les mêmes que ceux de .fail() : l'objet l'objet jqXHR, textStatus et errorThrown. Reportez-vous à la fonction deferred.always() pour les détails d'implémentation.

Voir aussi http://api.jquery.com/deferred.always/

13voto

David McMullin Points 1648

Les suggestions ci-dessous ne fonctionneront pas dans jQuery, car l'implémentation des promesses de jQuery ne gère pas les erreurs lancées dans les méthodes passées à l'utilisateur. Je ne les laisse ici qu'à titre d'illustration de ce qui pourrait être possible si jQuery était conforme à promises/A+. Comme Bergi le souligne à juste titre, vous devrez envelopper manuellement votre code dans votre propre bloc try catch.

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

Bien que je ne sois pas sûr que la promesse de jquery supporte always, une alternative serait d'utiliser then (encore) et de passer la même fonction comme successHandler et errorHandler, comme ceci :

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});

3voto

Juste une note pour ceux qui utilisent jQuery 3.0 et ultérieur

Avis de dépréciation : Les callbacks jqXHR.success(), jqXHR.error() et jqXHR.complete() sont supprimés depuis jQuery 3.0. Vous pouvez utiliser jqXHR.done(), jqXHR.fail() et jqXHR.always() à la place.

Comme dans la documentation officielle

2voto

KingRider Points 17

Il y a un bug ajax est dépendant du serveur, besoin de vérifier le statut avec "complete" est le meilleur, une sorte de "succès", "erreur" et d'autres ne sont pas 100% de la PUT, POST et GET ... regardez un exemple

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

Désolé, mauvais anglais ! Santé ;-)

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