Dois-je utiliser .done () et .fail () pour le nouveau code jQuery AJAX au lieu de succès et d'erreur

167

J'ai codé comme ceci:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

Mais quand je regarde la .ajax()documentation jQuery à la fin, il semble suggérer que je devrais coder comme ceci ci-dessous ou du moins cela suggère d'ajouter un .done()et un .fail():

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

Mettre à jour

Si je code comme ça, est-ce la même chose ou y a-t-il un avantage à le diviser en trois?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});
Alan2
la source

Réponses:

165

Comme indiqué par user2246674, l'utilisation successet errorcomme paramètre de la fonction ajax est valide.

Pour être cohérent avec la réponse précédente, lisez le document:

Avis de dépréciation :

Les rappels jqXHR.success (), jqXHR.error () et jqXHR.complete () seront obsolètes dans jQuery 1.8. Pour préparer votre code en vue de sa suppression éventuelle, utilisez plutôt jqXHR.done (), jqXHR.fail () et jqXHR.always ().

Si vous utilisez la fonction de manipulation de rappel ( en utilisant la méthode-enchaînant par exemple), l' utilisation .done(), .fail()et au .always()lieu de success(), error()et complete().

Michael Laffargue
la source
54
Je ne suis pas d'accord. Les références parlent des fonctions de manipulation de rappel (par exemple .error, .success) qui sont obsolètes au profit du modèle différé plus universel, mais les paramètres de la ajaxméthode ne sont pas obsolètes et sont à la fois valides et acceptables - même dans jQuery 1.9 / 2.0! Dans toutes les formes actuelles, ajaxrenvoie toujours un différé; éventuellement avec des rappels différés déjà attachés.
user2246674
1
Le voici, jQuery 1.9, et success :, error :, et complete: sont toujours utilisables. Cependant, ma question est, est-ce que .done () == au succès:?
TARKUS
3
@GregoryLewis à partir du code source de JQuery 1.10: jqXHR.success = jqXHR.done;.
Michael Laffargue
9
Je préfère honnêtement success, fail, always.
ahnbizcad
4
WOW, j'ai également mal lu la documentation. Je pensais littéralement que les options «succès» / «erreur» pour $ .ajax étaient réécrites en «terminé / échec». C'était juste les chaînes de méthodes de rappel. Honnêtement, je pense qu'ils auraient également dû changer les noms d'options. Cela m'a laissé perplexe pendant des heures.
OzzyTheGiant
12

Je veux ajouter quelque chose sur le post de @Michael Laffargue:

jqXHR.done() est plus rapide!

jqXHR.success()ont un certain temps de chargement dans le rappel et peuvent parfois surcharger le script. Je trouve cela difficile avant.

METTRE À JOUR:

En utilisant jqXHR.done(), jqXHR.fail()et jqXHR.always()vous pouvez mieux manipuler avec la requête ajax. En général, vous pouvez définir ajax dans une variable ou un objet et utiliser cette variable ou cet objet dans n'importe quelle partie de votre code et obtenir des données plus rapidement. Bon exemple:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});
Ivijan Stefan Stipić
la source
9
Avez-vous des références crédibles et vérifiables?
Paul Vargas
@PaulVargas Je ne fais jamais de test de performance, mais dans ma pratique, je trouve que cela fonctionne. Vous pouvez essayer par vous-même.
Ivijan Stefan Stipić
1
Veuillez fournir toute preuve de confiance.
wonsuc
Comme vous le savez, les fonctions de rappel sont plus lentes que de renvoyer certains objets de la fonction. Cela a parfois un faible impact, mais peut parfois être énorme si vous avez de nombreux appels.
Ivijan Stefan Stipić
7

En mots simples

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

s'il obtient le info.text, alors il alerte et quelle que soit la fonction que vous ajoutez ou, le cas échéant, comment il est impossible de récupérer info.text du serveur, puis alerte ou fonction d'erreur.

Yasir
la source
0

Lorsque nous allons migrer JQuery de 1.x vers 2x ou 3.x dans notre ancienne application existante, nous utiliserons .done, .fail au lieu de success, error car JQuery up gradation va être obsolète ces méthodes. Exemple lorsque nous appelons des méthodes Web du serveur, le serveur renvoie des objets de promesse aux méthodes appelantes (méthodes Ajax) et que ces objets de promesse contiennent des méthodes .done, .fail..etc. Voici l'exemple (c'est pour la requête POST de la même manière que nous pouvons construire pour un type de requête comme GET ...)

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
Sheo Dayal Singh
la source