web-dev-qa-db-fra.com

Existe-t-il un analogue à un "enfin" dans jQuery AJAX appels?

Existe-t-il un analogue Java "finalement" dans les appels jQuery AJAX? J'ai ce code ici. Dans mon always, je lève une exception, mais je veux TOUJOURS qu'elle passe à la méthode then ().

    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 done (), complete () et l'autre always (), mais rien ne semble fonctionner.

Voici JSFiddle:

http://jsfiddle.net/qv3t3L0m/

49
Oliver Watkins

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/

70

.always() devrait fonctionner. Reportez-vous à la section L'objet jqXHR à http://api.jquery.com/jQuery.ajax/ .

jqXHR.always (fonction (données | jqXHR, textStatus, jqXHR | errorThrown) {}); Une construction alternative à l'option de rappel complet, le La méthode .always () remplace la méthode obsolète .complete ().

En réponse à une requête réussie, les arguments de la fonction sont les identiques à ceux de .done (): data, textStatus et de l'objet jqXHR. Pour les demandes ayant échoué, les arguments sont les mêmes que ceux de .fail (): le Objet jqXHR, textStatus et errorThrown. Reportez-vous à deferred.always () pour les détails de la mise en œuvre.

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

31
jrummell

Les suggestions ci-dessous ne fonctionneront pas dans jQuery, car l'implémentation de la promesse de jQuery ne gère pas les erreurs renvoyées dans les méthodes passées à ce moment-là. Je ne les laisse ici que pour illustrer ce qui pourrait être possible si jQuery était conforme à la promesse/A +. Comme le souligne à juste titre Bergi, vous devrez manuellement insérer votre code dans votre propre bloc 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 prenne toujours en charge, une alternative serait d'utiliser (encore) et de transmettre la même fonction que 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");
});
8
David McMullin

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

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

Comme dans la documentation officielle

2
Jayavardhan Gange

Il y a un bug ajax dépend du serveur, besoin de vérifier l'état avec "complete" est le meilleur, une sorte de "succès", "erreur" et les autres ne sont pas à 100% du 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! Bravo ;-)

1
KingRider

si vous voulez une définition de code pour toutes les requêtes ajax, vous pouvez le faire comme ceci

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
0
sairfan