2017-03-17 8 views
1

Y at-il des différences techniques entre les méthodes de rappel suivantes?jQuery Différé fait vs rappel de succès

$.ajax({ 
    ... 
    success: function(data, textStatus, jqXHR) { 
    foo(data); 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
    bar(); 
    } 
}); 
$.ajax(...) 
    .done(function(data) { 
    foo(data); 
    }) 
    .fail(function() { 
    bar(); 
    }); 
$.ajax(...) 
    .then(function(data) { 
    foo(data); 
    }, function() { 
    bar(); 
    }); 

Avec peu d'expérience, je ne suis pas sûr qu'ils sont des exemples corrects pour passer data à foo(). (S'il vous plaît me corriger si je me trompe.)

Avec done/fail, nous ne pouvons pas suivre d'autres données comme jqXHR, textStatus, errorThrown, etc. Ai-je raison? Y at-il une équivalence complete pour la méthode done/fail? D'après votre expérience, est-il meilleur que/préféré par rapport aux autres dans certaines situations?

Si j'utilise à la fois success et done/then, sera une course avant que l'autre définitivement ou ne peut pas être certain qui se déroulera devant l'autre sans aucun doute? Ou utilise success et done/then tout à fait déconseillé?

Merci d'avance.

+1

Possible duplication de [jQuery.ajax handling continuer les réponses: "success:" vs ".done"?] (Http://stackoverflow.com/questions/8840257/jquery-ajax-handling-continue-responses-success- vs-done) – gyre

+3

'.then()' renvoie une nouvelle promesse de chaînage. '.done()' ne le fait pas. '.then()' est plus proche du standard de la promesse (dans JQ 3.0 il est en fait standard, pas complètement dans les versions antérieures). '.done()' est entièrement un design spécifique à jQuery et n'est régi par aucune norme de promesse. – jfriend00

Répondre

1

Une différence entre jQuery .done() et .then() est la valeur de retour peut être changé à .then()

Voir jQuery deferreds and promises - .then() vs .done()

$.Deferred(function(dfd) { 
 
    dfd.resolve(1) 
 
}) 
 
.done(function(n) { 
 
    return n + 1 
 
}) 
 
.then(function(res) { 
 
    console.log(res) // 1 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script>

$.Deferred(function(dfd) { 
 
    dfd.resolve(1) 
 
}) 
 
.then(function(n) { 
 
    return n + 1 
 
}) 
 
.then(function(res) { 
 
    console.log(res) // 2 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script>